ARC中:
1、可以說ARC所引入的最嚴(yán)格的限制是不能在C結(jié)構(gòu)體中放OC對象了..因此類似下面這樣的代碼是不可用的(ARC forbids Objective-C objects in structs or unions)
2、不能使用“new”開始的屬性名稱 (如果使用會有下面的編譯錯誤”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)。
ARC下方法名如果是以new/alloc/init等開頭的,而且還不是類的初始化方法,就該小心了,要么報(bào)錯,要么警告,原因你懂的。
3、橋接轉(zhuǎn)換問題。如果不進(jìn)行細(xì)究,NSString和CFStringRef是一樣的東西。在ARC中,編譯器需要知道這些指針應(yīng)該由誰來負(fù)責(zé)釋放,如果把一個NSObject看做是CF對象的話,那么ARC就不再負(fù)責(zé)它的釋放工作(記住ARC是only for NSObject的)
__bridge 只做類型轉(zhuǎn)換,不改變對象所有權(quán),是我們最常用的轉(zhuǎn)換符。
從OC轉(zhuǎn)CF,ARC管理內(nèi)存:
栗子:
- (void)viewDidLoad
{
[super viewDidLoad];
NSString *aNSString = [[NSString alloc]initWithFormat:@"test"];
CFStringRef aCFString = (__bridge CFStringRef)aNSString;
(void)aCFString;
}
CFArrayApplyFunction(peopleMutable, CFRangeMake(0, CFArrayGetCount(peopleMutable)), NgnAddressBookCallbackForElements, (__bridge void*)self);
例子:ABMultiValueAddValueAndLabel(multiValue, (__bridge void*)self.labelNumber.text, kABPersonPhoneMobileLabel, NULL);
4、ARC禁止結(jié)構(gòu)體里面有對象屬性(ARC forbids Objective-C objects in struct)。
5、ARC中property屬性必須指定一個內(nèi)存管理關(guān)鍵字,在屬性定義處增加strong關(guān)鍵字即可。
http://www.cocoachina.com/ios/20141117/10230.html
6、出現(xiàn)__unsafe_unretained錯誤,
unsafe_unretained等效于__unsafe_unretaind關(guān)鍵字聲明的變量;像上面說明的,iOS 5之前的系統(tǒng)用該屬性代替 weak來使用。
@interface CallViewController : UIViewController {
__weak NgnContact* contact;
}
@property (nonatomic, weak) NgnContact* contact;