黑马程序员 内存管理之引用计数器
-----------黑马程序员 IOS培训、Android培训、Java培训、期待与您交流----------------
/*
1. 在oc中非oc对象的基本数据都存放在内存中的栈中,oc对象存放在内存中的堆中,栈中的数据会随着某个模块的结束会自动释放里面的数据,堆是动态分配的,它不会随着某一模块的结束而释放
2. 计数器占4个字节,计数器上数字代表的是对象被占用的个数,例如3个人使用这个对象,那么计数器会显示3
3. retain一次,计数器+1,并返回对象本身
4. release一次,计数器-1
5. retaincount是计算计数器里的数字
*/
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
Car * _car;
int _age;
}
@end
@implementation Person
/*
1.当计数器为0时,对象会被销毁
2.对象被销毁时,系统会自动调用dealloc方法
*/
// 我们可以重新dealloc方法,使对象再被销毁时,做一些事情
- (void)dealloc
{
// 当前对象被销毁时,它所拥有的其他对象在dealloc里要进行一次release
[_car release];
[super dealloc];
}
@end
@interface Car : NSObject
@end
@implementation Car
@end
int main()
{
// 当使用alloc,new或copy时,必须对对象进行一次release一次,不然会造成内存泄露
Person *p = [[Person alloc] init];
// 计数器为0,对象被销毁,该对象变成僵尸对象
[p release];
// 出现野指针错误:EXC_BAD_ACCESS(code=1,address=....),野指针是指指向僵尸对象(不可用内存)的指针。对象一被销毁时,指向该对象的指针就是野指针
[p release];
return 0;
}