------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
引用计数器的基本操作
1、方法的基本使用
1> retain : 计数器+1,会返回对象本身
2>release : 计数器-1,没有返回值
3>retainCount : 获取当前的计数器
4>dealloc :
*当一个对象要被回收的时候,就会调用
*一定要调用[super dealloc],这句调用要放在最后
2、概念
1>僵尸对象:所占内存已经被回收的对象,僵尸对象不能被再使用
2>野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
3>空指针:没有指向任何东西的指针(存储的东西是nil,NULL,0),给空指针发送消息不会报错
内存管理代码的规范
1、只要调用alloc,必须有release(autorelease),如果不是通过alloc,则不需要release(例:
NSString *s = @"abc";没有看见alloc,不需要release)
2、set的代码规范
1>基本数据类型:直接复制
- (void)setAge:(int) age
{
_age=age;
}
2>OC对象类型
- (void)setCar:(Car *) car
{
if( car != _car) // 1.先判断是不是传进来的对象
{
[_car release]; // 2.对旧对象做一次release
_car=[car retain]; // 3.对新对象做一次retain
}
}
3、dealloc方法的代码规范
1>一定要[surper dealloc],而且放在最后
2>当前所拥有的其他对象要做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
autorelease
1、autorelease的基本用法
1>会将对象放到一个自动释放池中
2>当自动释放池被销毁时,会对池子里的所有对象做一次release
3>返回对象本身 Person *p = [[[ Person alloc ] init ] autorelease ];
4>调用完autorelease方法后,对象的计数器不变
2、autorelease的好处
1>不用再关心对象释放的时间
2>不用再关心什么时候调用release
3、autorelease的注意
1>占用内存较大的对象不要随便使用autorelease,需要自己精确控制
2>占用内存小的对象使用autorelease,没有太大影响
3>系统自带的方法,如果不包含alloc,new,copy,那么这些方法的返回对象都是已经autorelease过的。例:[NSString stringWithFormat:@”...”];[NSDate date];
4>开发中经常写类方法快速创建一个autorelease的对象,创建对象的时候不要直接使用类名,用self。解决子类调用父类的类方法创建时,创建成了父类对象,而创建不出子类对象例:
+ (id) person
{
return [[[self alloc ] init ] autorelease];
}
OC的ARC是编译器的特性(5.0之后强制ARC,不能调用内存相关的方法)
ARC的判断准则:只要没有强指针指向对象,就会释放对象
1、ARC的特点:
1>不允许调用release、retain、retainCount
2>允许重写dealloc,但是不允许调用[super dealloc]
3>@property的参数
*strong : 成员变量是强指针(适用于OC对象类型)
*weak : 成员变量是弱指针(适用于OC对象类型)
*assign : 适用于非OC对象类型
指针分两种:
1>强指针 : 默认情况下,所有的指针都是强指针 __strong
2>弱指针 : __weak
在ARC下
__weak Person *p = [[Person alloc] init]; // 错误写法,没有意义的写法 刚创建,因为没有强指针指向对象,又被销毁
2、两端循环引用的时候,解决方案
1>ARC :一端用strong,一端用weak
2>非ARC: 一端用retain,一端用assign
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------