自动引用计数( ARC, Automatic Reference Counting),内存管理中对引用采取自动计数的技术。
在LLVM编译器中设置 ARC 为有效状态,就无需再次键入 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 表为散列表(由于一个对象可以同时赋值给多个附有 __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);