通过 retainCount 的机制来决定对象是否需要释放。每次 runloop 的时候,都会检查对象的 retainCount,如果retainCount 为 0,说明该对象没有地方需要继续使用了,可以释放掉了。
ARC相对于MRC,不是在编译时添加retain/release/autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。
在编译期,ARC用的是更底层的C接口实现的retain/release/autorelease,这样做性能更好,也是为什么不能在ARC环境下手动retain/release/autorelease,同时对同一上下文的同一对象的成对retain/release操作进行优化(即忽略掉不必要的操作);ARC也包含运行期组件,这个地方做的优化比较复杂,但也不能被忽略
1.ARC 会自动执行 retain 、release、autorelease等操作,在ARC下不能主动调用这些内存管理方法。
2.ARC在调用这些方法时,并不通过objective-c的消息转发机制,而是直接调用其底层C语言版本API,这样做性能更好,因为保留及释放操作需要频繁的执行,直接调用其底层的函数能节省很多CPU周期,如ARC会调用与retain等价的底层函数objc_retain.
3.在使用ARC时必须遵循方法命名规则,alloc,new,copy,mutablecopy。ARC通过命名约定将内存管理标准化。
4.ARC管理对象生命期的办法是:在合适的地方,插入“保留”及“释放”操作。在方法中创建的对象,在方法中自动插入release;类中的对象,在dealloc方法中释放。
5.ARC下,变量的内存管理语义可以通过修饰符指明。
6.ARC只负责管理objective-c 对象的内存,CoreFoundation 对象不归ARC管理。