Autorelease和self点语法

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,保证线程下安全;

你可能感兴趣的:(Autorelease和self点语法)