黑马程序员技术交流社区
标题:
简单总结了内存管理——引用计数器
[打印本页]
作者:
AngleMGG
时间:
2014-9-22 22:40
标题:
简单总结了内存管理——引用计数器
内存管理总结
一、内存分5大区域,其中两大区域是堆和栈;
栈:存放局部静态变量,存储空间不需要手动回收;
堆:存放动态产生的对象,需要进行内存管理释放空间;
二、内存“管理工具”——引用计数器
1、每个OC对象都有一个int类型引用计数器,表示“对象被引用的次数”。
2、引用计数器在对象内部占据4个字节的存储空间;
3、使用alloc、new或者copy创建新对象,对象引用计数器值为1;
4、当对象的引用计数器值为0时,对象所占内存被回收——这就是内存管理的条件;
5、对引用计数器的操作:
[对象名 retain]使对象计数器值+1;
[对象名 release]表示对象计数器-1;
[对象名 retainCount]返回对象当前计数器值;
三、内存管理代码书写规范:
1、alloc与release成对出现;
1)、只要调用了alloc,必须有release出现;
int main()
{
Dog *d = [[Dog alloc] init];
……
[d release];
return 0;
}
2)、如果对象不是通过alloc产生的,就不需要release;
int main()
{
NSString *s = @“jonh”;
……
return 0;
}
2、set方法的代码规范
1)、基本数据类型:直接赋值,不需要管理内存;
- (void)setAge:(int)age
{
_age = age;
}
2)、OC对象类型
- (void)setDog:(Dog *)dog
{
//1、先判断传入的对象是不是新的,如果传入的对象是旧的则不接收该对象
if ( dog != _dog)
{
//2、对旧对象做一次release,释放就对象以便接收新对象
[_dog release];
//3、对新对象做一次retain
_dog = [dog retain];
}
}
3、dealloc方法的代码规范
1)、一定要有[super dealloc],而且必须放在最后面;
2)、对self(当前)所拥有的所有其他对象做一次release
- (void)dealloc
{
[_car release];
[_cat release];
[_dog release];
[super dealloc];
}
简单的总结可以规范代码书写,方便理解内存管理的本质。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2