Autorelease
实在是有些复杂;
由于我们现在还在学习当中,写的一些代码还比较少,所以自动释放池还不常用,在以后工作中,写一些比较复杂的app的时候才会经常用到自动释放池;
手动创建
@autoreleasepool {
//autorelease方法执行在池中;
}
当你对一个对象发出了autorelease方法后,该对象就会被放入最近的自动释放池中,当池被销毁时,会对池中的每一个对象发送一个release消息;
多次在同一个池中发送autorelease消息,在池被销毁时对象也会收到多次release消息;
系统自动释放
在UI工程中
如果我们不创建自动释放池时,系统会自行在一个runloop开始时创建一个自动释放池,在该runloop结束时销毁池,同时给池中对象发release消息;
系统类的便利构造器的内部实现中自带一个autorelease方法
便利构造器中的autorelease意义:我们通过便利构造器定义出来的对象�可以少释放一次;
数组,集合,字典
在释放的时候会对其中的元素发一个release消息,从其中移除一个元素也会对那个元素发一个release消息
self
在类的实现文件的函数中,self.XXX在使用getter方法时和_XXX的效果一样,但self.XXX在使用setter方法时,会导致XXX的引用计数+1;
setter方法重写
retain特性
-(void)setName:(NSString*)name{
if (_name != name) { // 在还没有赋值的时候_name属性是一个空指针,对空指针进行的任何操作都是安全的
//如果多次传入相同的对象,会造成内存不会被释放,导致内存泄露;
[_name release];
//如果不释放掉之前持有的内存就再赋值,会导致之前持有的内存无法被释放;
_name = [name retain];
//防止name被释放导致_name变成野指针;
}
}
copy特性
-(void)setGender:(NSString*)gender{
if (_gender != gender) {
[_gender release];
_gender = [gender copy];
}
}
getter方法重写
-(NSString*)name{
return _name
}
-(NSString*)name{
return [[_name retain] autorelease];
}
//如果是原子性操作,要先retain再autorelease,保证线程下安全;