关于 MRC 开发中的一些细节
1. 谁申请,谁释放,适用于面向对象开发的一个原则,“配对原则”
2. 如果在实例化对象的时候,使用了 alloc,retain,copy,new(alloc&init),就需要有对应的 release 方法
- allocWithZone 不需要配对的 release
3. 工具-静态分析工具(analysis)
可以从代码结构上分析是否存在内存缺陷,本身不会运行代码,能够发现大部分的问题
4. 如果一个方法需要返回对象,这个要返回的对象就需要添加 autorelease,对象会在自动释放池销毁之前被销毁
从而达到延迟释放的效果!
5. 如果是自定义 Copy 对象,需要使用 allocWithZone 方法为对象分配空间!
6. 如果自定义对象中有 copy,retain(相当于 arc 的strong)
需要在 dealloc 方法中释放
7. 知识点补充:
什么时候用 _name?什么时候用 self.name?
-self.name 是属性,对应有 getter&setter方法
*** 使用 self.name 能够借助默认的 setter 方法保证引用计数的平衡
-_name 是成员变量,是内存中的实例
使用细节
** 在第一次使用的时候,苹果官方建议使用 _name,赋初始值,例如:loadView,viewDidLoad方法中
提示:如果使用懒加载除外
** 在dealloc方法中使用 _name
// MRC 的 setter 方法中
- (void)setName:(NSString *)name {
// 1. 判断赋值的 name 和原来 _name 成员变量中保存的内容是否一致
if (name != _name) {
// 释放旧值
[_name release];
_name = name;
// 对新的值进行强引用
[_name retain];
}
}
8.如果是使用类方法,或者其他返回自动释放的对象,那么需要自己retain,否则一次运行循环后,就会被释放!