<h3 id="arc">ARC</h3>
ARC能夠解決iOS開發(fā)中90%的內(nèi)存管理問題,但是另外還有10%的內(nèi)存管理是需要手動管理的莉御,主要就是與底層Core Foundation對象交互的部分同仆,因?yàn)榈讓覥ore Foundation對象由于不在ARC的管理下浑侥。
使用ARC需要額外注意的兩個(gè)問題:
1.過度使用block產(chǎn)生的循環(huán)引用問題。
2.底層Core Foundation對象需要手動進(jìn)行內(nèi)存管理齿税。
<h3 id="corefoundation">Core Foundation對象的內(nèi)存管理</h3>
底層的Core Foundation對象的創(chuàng)建,大多數(shù)以XxxCreateWithXxx這樣的方式創(chuàng)建炊豪,例如:
//創(chuàng)建一個(gè)CFStringRef對象
CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault,"hello world",kCFStringEncodingUTF8);
或者
//設(shè)置字間距
+ (NSAttributedString *)setLabelAttributeString:(NSString*)labelText withCharactorSpace:(CGFloat)charactorSpace{
NSMutableAttributedString *string =[[NSMutableAttributedString alloc]initWithString:labelText];
long number = charactorSpace;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
[string addAttribute:(id)kCTKernAttributeName value:(__bridge id)num range:NSMakeRange(0,[string length])];
CFRelease(num);
return string;
}
對于這種對象的修改和釋放凌箕,需要相應(yīng)的使用CFRetain和CFRelease。
除此之外词渤,還有另外一個(gè)問題需要解決牵舱。在ARC下,我們有時(shí)需要將一個(gè)Core Foundation對象轉(zhuǎn)換成Objective-C對象缺虐,這個(gè)時(shí)候我們需要告訴編譯器芜壁,轉(zhuǎn)換過程中的引用計(jì)數(shù)如何調(diào)整。這就引入了與bridge相關(guān)的關(guān)鍵字:
-
__bridge
:只做類型轉(zhuǎn)換,不修改相關(guān)對象的引用計(jì)數(shù)顷牌,原來的Core Foundation對象在不用時(shí),需要調(diào)用CFRelease方法塞淹。 -
__bridge_retained
:類型轉(zhuǎn)換后,將相關(guān)對象的引用計(jì)數(shù)+1饱普,原來的Core Foundation對象在不用時(shí)运挫,需要調(diào)用CFRelease方法套耕。 -
__bridge_transfer
:類型轉(zhuǎn)換后贿条,將該對象的引用計(jì)數(shù)交給ARC管理斜脂,Core Foundation對象在不用時(shí)鲸睛,不再需要調(diào)用CFRelease方法关划。
我們根據(jù)業(yè)務(wù)邏輯,合理使用上面三種轉(zhuǎn)換關(guān)鍵字翘瓮,就可以解決Core Foundation對象與Objc對象相互轉(zhuǎn)換的問題了。