第一點:是什么余指?
- ARC 翻譯過來就是自動引用計數(shù),是幫助我們做對象內(nèi)存管理的一套機制碉碉,使得我們在 MRC 模式下管理內(nèi)存的工作量得到緩解笋婿。
- ARC 是編譯時特性,相當(dāng)于編譯器幫我們插入了內(nèi)存管理代碼足丢,因此并沒有改變 Objective-C 使用引用計數(shù)管理內(nèi)存的本質(zhì)斩跌。
第二點:有什么捞慌?
__strong 修飾符
- 表示強引用,對應(yīng)類屬性的 strong 修飾符袖订。
- 強引用會讓對象引用計數(shù)加一。
- 在聲明引用時不添加修飾符上沐,那么默認(rèn)就是采用 __strong 修飾楞艾。
- 修飾的變量會自動初始化為 nil。
NSString *str; // 兩種方法效果是一樣的
NSString *str = nil;
__weak 修飾符
- 表示弱引用蕴侧,對應(yīng)類屬性的 weak 修飾符两入。
- 弱引用不會對對象做任何操作。
- 對象被釋放時塘娶,弱引用指針會被置為 nil痊夭,從而避免野指針錯誤的發(fā)生。
- 經(jīng)常用來解決循環(huán)引用問題虹曙。
- 只用于 iOS5 及以上版本番舆,iOS5 以下使用 __unsafe_unretained 修飾符來替代。
- 修飾的變量會自動初始化為 nil疏哗。
__autoreleasing 修飾符
- 表示把對象注冊到 Autorelease Pool 中禾怠,沒有對應(yīng)類屬性修飾符。
- 作用就是延遲對象的釋放時機芽偏,在 Autorelease Pool 銷毀時被釋放弦讽。
- 和 MRC 特性下的 autorelease 的作用相同。
- 修飾的變量會自動初始化為 nil被碗。
__unsafe_unretaied 修飾符
- 表示不安全引用,對應(yīng)類屬性的 unsafe_unretained 修飾符缩抡。
- 修飾的指針只是純粹地指向?qū)ο蟀洌趯ο蟊会尫藕蟪闪艘爸羔樏浣溃浅2话踩?/li>
第三點:怎么做滴肿?
- 母雞。
第四點:補充點贵少?
Core Foundation 與 Objective-C 類型轉(zhuǎn)換
__bridge 修飾符
CFStringRef s1 = (__bridge CFStringRef)[[NSString alloc] initWithFormat:@"Hello, %@!", @"Kobe"];
// 你不需要用 CFRelease() 去釋放 s1堆缘。
- __bridge 只是做了 NSString 到 CFStringRef 的轉(zhuǎn)化,內(nèi)存管理規(guī)則未變录平,所以你不需要調(diào)用 CFRelease() 去釋放 s1缀皱。
__bridge_retained 修飾符
NSString *s1 = [[NSString alloc] initWithFormat:@"Hello, %@!", @"Kobe"];
CFStringRef s2 = (__bridge_retained CFStringRef)s1;
// or CFStringRef s2 = (CFStringRef)CFBridgingRetain(s1);
// do something with s2
//...
CFRelease(s2); // 注意要在使用結(jié)束后加這個
- 表示將指針類型轉(zhuǎn)變的同時,將內(nèi)存管理的責(zé)任由 ARC 轉(zhuǎn)變?yōu)?MRC表箭。
- 這時我們需要手動的來管理 s2 的內(nèi)存钮莲,而對于 s1,我們即使將其置為 nil伯襟,也不能釋放內(nèi)存握童。
__bridge_transfer 修飾符
CFStringRef result = CFURLCreateStringByAddingPercentEscapes(. . .);
NSString *s = (__bridge_transfer NSString *)result;
//or NSString *s = (NSString *)CFBridgingRelease(result);
return s;
- 表示將指針類型轉(zhuǎn)變的同時,將內(nèi)存管理的責(zé)任由 MRC 轉(zhuǎn)變?yōu)?ARC俺附。
- 這里我們將 result 交給了 ARC 來處理,因此就不需要再顯式地調(diào)用 CFRelease() 去釋放 s事镣。
關(guān)于 Autorelease Pool
在沒有手加 Autorelease Pool 的情況下璃哟,Autorelease 對象是在當(dāng)前的 runloop 迭代結(jié)束時釋放的喊递,而它能夠釋放的原因是系統(tǒng)在每個 runloop 迭代中都加入了自動釋放池 Push 和 Pop。
實驗時注意:
1骚勘,蘋果 在64位系統(tǒng)中,數(shù)據(jù)類型對象和字符串可能被存儲到變量中俏讹。
2,ARC下户矢,可以用 __autoreleasing 修飾符把對象注冊到自動釋放池殉疼。
3,ARC下驱证,可以用 valueForKeyPath:@"retainCount" 查看引用計數(shù)恋腕。
參考:
iOS開發(fā)ARC內(nèi)存管理技術(shù)要點
黑幕背后的Autorelease
Objective-C Autorelease Pool 的實現(xiàn)原理
Transitioning to ARC Release Notes