自動引用計(jì)數(shù)( ARC, Automatic Reference Counting)舔腾,內(nèi)存管理中對引用采取自動計(jì)數(shù)的技術(shù)找御。
在LLVM編譯器中設(shè)置 ARC 為有效狀態(tài)误辑,就無需再次鍵入 retain 或者是 release 代碼。
__strong泌参、__weak、__autorealse的編譯器代碼
id __strong obj = [[NSObject alloc] init];
//編譯器代碼
id obj = objc_msgSend(NSObject,@seletor(alloc));
objc_msgSend(obj, @seletor(init));
objc_release(obj);
如附有 __weak 修飾符的變量所引用的對象被廢棄常空,則將 nil 賦值給該變量沽一。
使用附有 __weak 修飾符的變量,即使用就會注冊到 autoreleasepool 中的對象漓糙。
id __weak obj1 = obj;
//編譯器代碼 weak 表為散列表(由于一個(gè)對象可以同時(shí)賦值給多個(gè)附有 __weak 修飾符的變量中铣缠,所以對于一個(gè)鍵值,可注冊多個(gè)變量地址)
id obj1;
objc_initWeak(&obj1, obj); //將obj1的地址注冊到 weak 表中昆禽。
objc_destroyWeak(&obj1,0); //把變量地址從 weak 表中刪除蝗蛙。
@autoreleasepool
{
id __autorelease obj = [[NSObject alloc] init];
}
//編譯器的模擬代碼
id pool = objc_autoreleasePoolPush();
id obj = objc_msgSend(NSObject, @selector(alloc));
objc_msgSend(NSObject, @selector(init));
objc_autorelease(obj);
objc_autoreleasePoolPop(pool);