这篇博客主要会介绍关于@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
网友评论