ARC
在运行时做了哪些工作?
-
主要是指
weak
关键字。weak
修饰的变量能够在引用计数为0
时被自动设置成nil
,显然是有运行时逻辑在工作的。 -
为了保证向后兼容性,
ARC
在运行时检测到类函数中的autorelease
后紧跟其后retain
,此时不直接调用对象的autorelease
方法,而是改为调用objc_autoreleaseReturnValue
。objc_autoreleaseReturnValue
会检视当前方法返回之后即将要执行的那段代码,若那段代码要在返回对象上执行retain
操作,则设置全局数据结构中的一个标志位,而不执行autorelease
操作,与之相似,如果方法返回了一个自动释放的对象,而调用方法的代码要保留此对象,那么此时不直接执行retain
,而是改为执行objc_retainAoutoreleasedReturnValue
函数。此函数要检测刚才提到的标志位,若已经置位,则不执行retain
操作,设置并检测标志位,要比调用autorelease
和retain
更快。
ARC
在编译期时做了哪些工作哪
ARC相对于MRC,不是在编译时添加retain/release/autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。
在编译期,ARC用的是更底层的C接口实现的retain/release/autorelease,这样做性能更好,也是为什么不能在ARC环境下手动retain/release/autorelease,同时对同一上下文的同一对象的成对retain/release操作进行优化(即忽略掉不必要的操作);