OC内存管理原则
在做Vuforia-iOS-Lib的Demo程序时,发现库中的Controller在MRR工程中会得不到释放。我看了Apple官网的“Advanced Memory Management Programming Guide”,收获不小,做点笔记。
思考角度
内存管理应该从对象所有权的角度思考,而不应该从引用计数的角度,去过分强调实现细节。
基本原则
- 你拥有任何你创建的对象。
- 使用 “alloc”, “new”, “copy”或者“mutableCopy” 创建的对象。
- 可以利用retain获取对象的所有权。
- 在存取方法或init中获取对象所有权作为自身属性;
- 为避免其他操作将对象销毁而造成问题;
- 当不需要对象时,必须释放对其所有权。
- 利用“release” 或 “autorelease”
- 必须释放不该拥有的对象的所有权。
其他原则
- 你不拥有以引用形式返回的对象。
- 比如
ClassName **
或id *
- 比如
用存取方法来管理内存。
- 用来赋值给属性;
- 不在
init
和dealloc
中使用存取方法
用弱引用来避免循环引用。
- 不用
dealloc
管理稀缺资源。- 不应该在
dealloc
中管理文件描述符,网络连接或缓存等。 - 因为程序的bug或突然中断会导致
dealloc
不能正常调用; - 因为对象图的析构顺序不确定。
- 不应该在