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,保证线程下安全;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 37.cocoa内存管理规则 1)当你使用new,alloc或copy方法创建一个对象时,该对象的保留计数器值为1...
    如风家的秘密阅读 4,390评论 0 4
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,406评论 30 472
  • 参考此文:http://www.2cto.com/kf/201403/284687.html@看到这个关键字,我们...
    如风家的秘密阅读 3,674评论 0 2
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 5,521评论 1 3
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,012评论 8 119

友情链接更多精彩内容