iOS property详解

作者: ManThirty | 来源:发表于2017-08-06 15:41 被阅读13次

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

    相关文章

      网友评论

        本文标题:iOS property详解

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