OC 与 Java内存管理的区别
Java的内存对象 系统会自动检测, 当没有指针用这个对象时, 对象会被系统自动回收,OC 在ARC管理之前, 是需要手动回收内存的。
OC中方法的使用
1> retain: 计数器+1, 会返回对象本身
2>release: 计数器-1, 没有返回值
3>retainCount: 获取当前的计数器
4>dealloc:
当一个对象被回收的时候, 一定要调用[super dealloc] , 这句话要放最后面, 因为super的回收要放最后面。
几个概念:
1.僵尸对象: 所占用内存已经被回收的对象, 是不可用对象
2.野指针: 指向僵尸对象, 也就是不可用内存的指针, 给野指针发送消息会报错(EXC_BAD_ACCESS)
3.空指针: 没有指向任何东西的指针,给空指针发送消息一般不会报错
几个结论:
如果你用alloc new [mutable] copy创建一个对象, 那么你必须调用release 或 autorelease来释放对象, 换句话说, 这个对象不是你创建的, 你不需要release
内存管理代码规范:
1>只要调用alloc, 必须有release
2>set方法的代码规范
-age = age;
例如:OC对象类型操作(在手动release & retain内存时)
- (void)setBook: (Book*) book {
//1>判断传进来的是新书 还是 旧书
if (book != _book) {
//2>对旧对象进行一次release操作
[_book release];
//3>对新对象做一次retain
-book = [book retain];
}
}
dealloc方法的代码规范:
1>一定[super dealloc] 一定要放到最后面
2>对self(当前)所拥有的其他对象进行一次release
例如:
- (void)dealloc
{
[_book release];
[super dealloc];
}