定义
内存管理:基本类型数据(int、char、float、double、struct、enum等是存在栈里)由操作系统自己释放,而OC对象由程序员自己释放,不释放的花程序结束时由系统释放(堆),内存使用由4个字节的引用计数器来控制,当计数器为0时,对象被回收,当使用alloc、new来创建一个新对象时,新对象的引用计数器默认就是1。
僵尸对象:所占内存已经被回收的对象。(僵尸对象不能被再使用)
野指针:指向僵尸对的指针(不可用内存),给野指针发送消息会报错。(错误信息EXC_BAD_ACCESS)。
空指针:没有指向任何东西的指针。(储存的东西是nil,null,0)给空指针发送消息不会报错(Java会报错)。
注:程序闪退有可能是给释放的对象发送消息
retain : 当给对象发送一条retain消息,可以使引用计数器值+1。(retain方法会返回对象本身)
release:当给对象发送一条release消息计数器-1.(没有返回值)
retainCount:获得当前的计数器
dealloc方法:当一个对象要被回收的时候,就会调用。 重写方法时一定要调用[super dealloc],这句调用要放在最后面。对self(当前)所拥有的其他对象做 一次release。
e.g.:
- (void)dealloc
{
[super dealloc];
}
dealloc原则:
1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)
set方法内存管理的代码规范:
1.如果是基本数据类型直接赋值。
2.如果是OC对象要先对就对象做一次release,给新对象retain。
e.g.:
- (void)setCar:(Car *)car
{
1.先判断是不是新传进来对象
if ( car != _car )
{
2.对旧对象做一次release
[_car release];
3.对新对象做一次retain
_car = [car retain];
}
}
- (void)dealloc
{
[_car release];
[super dealloc];
}