• 属性和成员变量


    声明了@property@synthesize后编译器会为你的实例变量生成getter和setter,这些方法会遵循你声明的内存管理的语义,在set的时候执行对应的操作,比如retaincopy等;但它们是方法,而不是变量,所以obj.foo = @"a"其实是一个语法糖,等同于[obj setFoo:@"a"]。在过去你还需要声明对应的实例变量,并通过@synthesize foo = _foo的方式建立和它们之间的关系,但新的Clang编译器会默认帮你加入@synthesize的步骤,默认实例变量形式为property名加下划线。但是你依然可以声明实例变量,并手动建立和property的关系,尤其是实例变量的形式与默认的不同,比如:@synthesize foo = _bar

    一般的情况下你应该多用@property,因为它可以进行某种程度的自动内存管理(根据你声明时的语意义),但是由于getter和setter本质上是普通的方法,所以它们可以被覆盖,可以执行除了get和set额外的操作(副作用),所以在某些情况下(比如init...和dealloc方法里)你会手动去进行赋值。

    同理,由于@property声明的是方法,你可以不必有对应的实例变量,而是自行实现一个getter和setter执行自定义的操作。有时候你甚至不用去声明对应的实例变量和getter/setter,因为它们在父类已经存在,或者在运行时才存在,那么这时候你会用到@dynamic而不是@synthesize,不然编译器会报错。

    关于使用实例变量还是@property,其实和用不用ARC没有太多关系。。。,它们也不是互相替代的关系

    链接
    0

    本质上来讲,属性也会帮你定义一个成员变量,并根据属性的声明自动生成getter/setter 方法,其中setter 方法根据属性(property)的属性(attribute)来提供不同的内存管理策略。

    简单翻译一个SO的答案:Why would you use an ivar?,展开说一下成员变量的好处。

    封装

    如果成员变量是private,程序中的其它对象很难直接访问该成员变量。如果是属性,相对更容易用父类方法读写属性。

    性能

    成员变量地址可以根据实例的内存地址偏移寻址。而属性的读写都需要函数调用,相对更慢。

    非基础类型

    对于复杂的C++类型,往往设为成员变量更合适,也许这种类型不支持copy,或者完全复制很麻烦。

    多线程

    多线程环境下,为保证数据一致性,在需要同步执行的代码段更应该使用成员变量。如果对需要同步更新的数据用getter/setter 方法,数据更新效率低,会带来更多的获取锁请求失败。

    程序正确性

    成员变量可以做直观的内存管理。属性可以一层层继承,还可以复写。容易出错。

    二进制文件的体积

    默认用属性,会生成不必要的getter/setter 方法,程序体积会变大。

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/yulang314/p/3614435.html
Copyright © 2020-2023  润新知