autorelease的优化
在Objective-C高级编程中,提到了autorelease的优化。即Autorelease返回值的快速释放机制,并特意注明在objc4版本中只能在OS X 64位中最优化。
MRC下的流程,例如 工厂方法->调用
秉着谁创建谁释放的原则,返回值需要是一个autorelease对象才能配合调用方正确管理内存(也是对命名规范的另一种角度解释),而我们拿到一个autorelease的对象是如何做的,是不是先retain,然后再在自身作用域结束的时候release一下。例如:
alloc autorelease —> retain release
ARC中会进行以下代码优化
无论模拟器还是真机,Product/Perform Action/Assemble Xcode8.1 从汇编代码中发现,编译器添加的代码。
ARC下,根据命名规则如果返回一个自动释放的对象,使用_objc_autoreleaseReturnValue 取代autorelease,如果需要对一个自动释放的对象,进行持有,则使用_objc_retainAutoreleasedReturnValue 取代retain
alloc _objc_autoreleaseReturnValue —> _objc_retainAutoreleasedReturnValue release
autorelease后再retain,是多余操作。因此,_objc_autoreleaseReturnValue(obj)函数会检测obj的执行命令列表,如果obj紧接着调用了_objc_retainAutoreleasedReturnValue(),那么_objc_autoreleaseReturnValue()不会将对象注册到自动释放池。runtime将obj储存在TLS中,然后直接返回这个obj;同时,在外部接收这个返回值的objc_retainAutoreleasedReturnValue里,发现TLS中正好存了这个对象,那么直接返回这个obj
这些函数的实现因处理器而异
这一切都是对autorelease的优化,autorelease作为优化的起点