property是OC的一项特性,主要的作用在于封装对象中的数据。官方文档对property的定义是:
A declared property provides a syntactical shorthand for declaring a class’s accessor methods and, optionally, implementing them.
所以说,声明一个property,实际上等于声明了对应的accessor(访问器)方法,编译器会根据property的设置自动帮我们实现get方法和set方法。
- 对于readwrite(系统默认属性)的属性来说,编译器声明set方法和get方法;
- 对于readonly的属性来说,编译器只声明get方法
properyty的本质
@property = ivar + gett + sett
property包含两部分:
- 实例变量
- 存取方法
关键字
@synthesize 和 @dynamic
-
@synthesize
: 该指令告诉编译器生成set和get方法,如果自定义set和get方法,则会覆盖编译器生成的方法; -
@dynamic
: 该指令告诉编译器在编译期间不自动生成set个get方法,由自己实现存取方法或存取方法在运行时动态创建绑定。主要用在NSManagerObject对象的属性声明中,由于此类对象的属性一般是从Core Data的属性中生成的,Core Data框架会在程序运行时为此类生成get和set方法。
@atomic 和 @nonatomic
-
@atomic
:property默认为atomic属性,可以保证在多线程情况下,编译器会自动生成一些互斥锁代码,避免该变量的读写不同步的问题。但是atomic并不能真正做到完全避免数据同步时的线程按钮,需要采用更为深层的锁定机制。 -
@nonatomic
: nonatomic可以让编译器少产生一些互斥锁代码,提高性能和效率
atomic是OC使用的一种线程保护技术,这种机制是非常耗费系统资源的,所以在iOS开发时,建议使用nonatomic属性,提供性能和效率
strong/weak/retain/assign/copy
-
strong
: 指针指向值的内存地址,并将引用计数+1; -
weak
: 指针指向值的内存地址,但引用计数不会变化,当值被释放时,指针为nil; -
retain
: retain现在和strong是一样的,指针指向值地址,同时引用计数+1; -
copy
: 重新开辟一块新的内存来保存一份相同的数据,被赋值对象和原值修改互不影响,但数据内的指针指向不会改变。 -
assign
: 指针指向值的内存地址,引用计数不变化,如果当该内存地址被释放,指针变为野指针,可能会造成崩溃。
注意事项
苹果官方建议,在一般情况下尽量使用accessor方法来访问一个property,而不是直接访问它对应的实例变量。但是在一个对象的init方法、deallocate、自定义的accessor方法中不建议调用accessor方法。