引用计数管理内存的思考四大原则:
- 自己生成的对象,自己持有
- 非自己生成的对象,自己也能持有
- 不再需要自己持有的对象及时释放
- 无法释放非自己持有的对象(直接crash)
注:释放非自己持有的对象crash
以 alloc,new, copy,,mutableCopy
这些方法开头的方法名会被默认标记为 __attribute((ns_returns_retained))
,以这些方法创建的对象,编译器在会在调用方法外围要加上内存管理代码retain/release
,所以其在作用域结束的时候就会释放,而不以这些关键字开头的方法,会被默认标记为__attribute((ns_returns_not_retained))
,编译器会在方法内部自动加上autorelease
方法,这时创建的对象就会被注册到自动释放池中,同时其释放会延迟,等到自动释放池销毁的时候才释放。
用引用计数表(散列表)管理引用计数的好处:
- 对象用内存块的分配无需考虑内存块头部
- 引用计数表各记录中存有内存块地址,可以从各个记录追溯到各对象的内存块。
- 在利用工具检测内存泄漏时,引用计数表的各记录有助于检测各对象的持有者是否存在。