iOS property详解

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方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容