美文网首页
关于@property你真的了解吗?

关于@property你真的了解吗?

作者: 五月一日的凤梨罐头orz | 来源:发表于2016-06-07 14:47 被阅读84次

    这篇博客主要会介绍关于@property的一些关键字用法,以及@property的一些大家并不太会关心但是却很重要的知识点。
    相信大家对于@property中assign,strong,weak,copy,nonatomic等关键字的用法已经很了解了,在此再帮大家复习一下。

    使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用“对象.属性”的方法调用;如果我们想要“对象.方法”的方式来调用一个方法并获取到方法的返回值,那就需要使用@property配合@dynamic了
    使用@dynamic关键字是告诉编译器由我们自己来实现访问方法。如果使用的是@synthesize,那么这个工作编译器就会帮你实现了。

    关键字的解释

    readonly表示属性是只读的,如果你尝试使用.操作符对其进行写操作,将会得到一个编译错误;
    readwrite表示属性是可读可写的,这个是默认操作。
    atomic提供对对象的原子操作,保证多线程安全。加上atomic,setter方法会变成这样:
    {lock}
    if (property != newValue) {
    [property release];
    property = [newValue retain];
    }
    {unlock}
    strong声明一个对对象的强引用,使对象的引用计数加1,一个对象只有当有强指针指向它,才会被保留在内存中,否则就会被销毁;
    weak声明一个对对象的弱引用,不会改变对象的引用计数,在对象被释放时,该弱指针会被自动设置为nil;
    assign在ARC环境下,一般用于修饰基础数据类型,直接复制,它不会使对象的引用计数加1;
    copy不会改变对象的引用计数,它会新建一个对象的副本,深拷贝,拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。对copy的副本的操作不会影响原对象;
    retain只能在MRC环境下使用,作用是使对象的引用计数加1;

    retain与copy的区别:

    retain将对象的引用计数加1,不会创建新的对象,copy不会改变对象的引用计数,会创建一个新的对象,所以retain是指针拷贝(浅拷贝),copy是内容拷贝(深拷贝)。

    retain与assign的区别:

    assign是直接赋值,例如给对象a分配了一块内存,把a赋值给b,此时a和b指向的是同一块内存,当a释放这块内存时,b并不清楚这块内存已经被释放,仍然指向这块已经被回收的内存,b此时变为悬垂指针,继续使用会导致程序的crash。
    使用retain的好处就是,由于每次进行赋值操作引用计数都会加1,进行释放引用计数都会减1,当引用计数为0的时候,系统才会把这块内存释放掉,保证了内存的正确使用。

    @property默认关键字

    atomic,assign,readwrite

    相关文章

      网友评论

          本文标题:关于@property你真的了解吗?

          本文链接:https://www.haomeiwen.com/subject/yblkdttx.html