ARC中:
1、可以說ARC所引入的最嚴格的限制是不能在C結構體中放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等開頭的,而且還不是類的初始化方法,就該小心了,要么報錯,要么警告,原因你懂的。
3、橋接轉換問題。如果不進行細究,NSString和CFStringRef是一樣的東西。在ARC中,編譯器需要知道這些指針應該由誰來負責釋放,如果把一個NSObject看做是CF對象的話,那么ARC就不再負責它的釋放工作(記住ARC是only for NSObject的)
__bridge 只做類型轉換,不改變對象所有權,是我們最常用的轉換符。
從OC轉CF,ARC管理內存:
栗子:
- (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禁止結構體里面有對象屬性(ARC forbids Objective-C objects in struct)。
5、ARC中property屬性必須指定一個內存管理關鍵字,在屬性定義處增加strong關鍵字即可。
http://www.cocoachina.com/ios/20141117/10230.html
6、出現__unsafe_unretained錯誤,
unsafe_unretained等效于__unsafe_unretaind關鍵字聲明的變量;像上面說明的,iOS 5之前的系統用該屬性代替 weak來使用。
@interface CallViewController : UIViewController {
__weak NgnContact* contact;
}
@property (nonatomic, weak) NgnContact* contact;