自動引用計數( ARC, Automatic Reference Counting),內存管理中對引用采取自動計數的技術。
在LLVM編譯器中設置 ARC 為有效狀態(tài),就無需再次鍵入 retain 或者是 release 代碼。

ARC.png
__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 表為散列表(由于一個對象可以同時賦值給多個附有 __weak 修飾符的變量中,所以對于一個鍵值,可注冊多個變量地址)
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);