【问题标题】:Property access, style or substance?财产准入、风格或实质?
【发布时间】:2011-06-30 13:46:56
【问题描述】:

访问对象的属性有三种不同的语法风格:

myProp = value;
self.myProp = value;
[self setMyProp: value];

这些是纯粹的风格选择还是有实质区别?

【问题讨论】:

标签: objective-c ios macos


【解决方案1】:
self.myProp = value;

[self setMyProp: value];

是样式选择,因为它们使用访问器来设置值。也就是说,self.myProp 本质上与调用[self setMyProp][self myProp] 相同。它将实现您在@property 标签中定义的任何机制(保留、根据需要释放等)。

然而,

myProp = value;

本质上是不同的,因为它只是一个分配。不考虑释放myProp的原始指针,保留新值等。

【讨论】:

  • 因此,只要我们不使用 getter/setter 名称做任何时髦的事情,所有这些都访问同一个变量。唯一的区别是直接分配忽略为属性定义的任何复制/保留/周/强属性。这意味着直接赋值应该很少在自定义 getter/setter 之外使用,并且只在它们内部使用。
  • 除非您的财产是retaincopy;直接访问绕过了该行为。这也是为什么你会看到很多人使用@synthesize myProp = myProp_; 来创建具有不同名称的 ivar。这个问题已经出现过很多次了;搜索档案。
【解决方案2】:

第一个是直接分配给 iVar myProp。 第二个和第三个是一样的。 您应该更喜欢第二个或第三个,因为当您使用 @synthesize 时,setter 会为您进行内存管理。

【讨论】:

    【解决方案3】:
    myProp = value;
    

    这是对 C 变量的直接赋值。这根本不是属性访问。

    self.myProp = value;
    

    这是语法糖:

    [self setMyProp: value];
    

    这是什么意思?这意味着前者在为其发出代码之前由编译器翻译成后者。这就是点符号的only 含义。只要类声明方法myPropsetMyProp: 点符号就可以工作。 myProp 不需要是正式意义上的属性(即用 @property 声明)。它也不需要合成。不需要单个实例变量来支持它。只要这两个方法在运行时存在(或者如果您从未分配给属性,则存在 getter),您可以使用点表示法。它与 Objective-C 属性正交。

    所以答案是,是的,对于您的后两个示例,这纯粹是风格问题。就个人而言,我讨厌点符号。这是对语言语法的不必要污染(我的意思是,我们现在有两种表达消息发送的方式,其中一种看起来与完全不同的语言特征相同)。 /咆哮

    【讨论】:

      【解决方案4】:

      您的示例 #2 和 #3 编译相同,但 #1 有一个重要区别——它不调用 setter。这使它在 setter 中很有用(必需),否则您将创建一个无限循环。

      例如,这个setter创建了一个无限循环:

      - (void)setMyProp:(int)value
      {
      self.myProp = value;
      }
      

      在 getter 中也是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-01
        相关资源
        最近更新 更多