返回注册到autoreleasepool中对象的方法使用了objc_autoreleaseReturValue函数返回注册到autoreleasepool中的对象。但是objc_autoreleaseReturValue函数同objc_autorelease函数不同,一般不仅限于注册对象到autoreleasepool中。
objc_autoreleaseReturValue函数会检查使用该函数的方法或函数调用方的执行命令列表。如果方法或函数的调用方在调用了方法或函数后紧接着调用objc_retainAutoreleasedReturnValue()函数,那么就不将返回的对象注册到autoreleasepool中,而直接传递到方法或函数的调用方。objc_retainAutoreleasedReturnValue函数与objc_retain函数不同,它即便不注册到autoreleasepool中而返回对象,也能够正确地获取对象。
通过objc_autoreleaseReturnValue函数和objc_retainAutoreleasedReturnValue函数的协作,可以不讲对象注册到autoreleasepool中而直接传递,这一过程达到了最优化。
__weak 修饰符
若附有__weak修饰符的变量所引用的对象被废弃,则将nil赋值给该变量。 使用附有__weak修饰符的变量,即是使用注册到了autoreleasepool中的对象。
{
id __weak obj1 = obj;
}
/** 编译器的模拟代码 */
id obj1;
objc_initWeak(&obj1,obj);
objc_destroyWeak(&obj1);
通过objc_initWeak函数初始化附有__weak修饰符的变量,在变量作用域结束时通过objc_destroyWeak函数释放该变量。
如以下源码所示,objc_initWeak函数将附有__weak修饰符的变量初始化为0后,会将赋值的对象作为参数调用objc_storeWeak函数。
obj1 = 0;
objc_storeWeak(&obj1,obj);
objc_destroyWeak函数将0作为参数调用objc_storeWeak函数。
objc_storeWeak(&obj1,0);
即前面的源代码和以下代码相同:
id obj1;
obj1 = 0;
objc_storeWeak(&obj1,obj);
objc_storeWeak(&obj1,0);
objc_weakStore函数把第二参数的复制对象的地址作为键值,将第一参数的附有__weak修饰符的变量的地址注册到weak表中,如果第二参数为0,则把变量的地址从weak表中删除。
weak表与引用计数表相同,作为散列表被实现。如果使用weak表,将废弃对象的地址作为键值进行检索,能高速地获取对应的附有__weak修饰符的变量的地址。另外,由于一个对象可以同时赋值给多个附有__weak修饰符的变量中,所以对于一个键值,可注册多个变量的地址。
释放对象时,废弃谁都不持有的对象,通过objc_release函数释放。
objc_release 因为计数为0,所以执行dealloc _objc_rootDealloc object_dispose objc_destructInstanse objc_clear_deallocating对象被废弃时最后调用的objc_clear_deallocating函数动作如下:










