【问题标题】:What is the difference when declaring instance variable with a property or not declaring? [duplicate]用属性声明实例变量或不声明有什么区别? [复制]
【发布时间】:2012-07-15 16:42:13
【问题描述】:

可能重复:
Properties and Instance Variables in Objective-C 2.0

当我在第一种情况下使用@property 和@synthesize 以及@property 和@synthesize 并声明相同的实例变量时有什么区别?因为两者似乎都有效。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    没有区别:将使用您声明的实例变量,并且其 ARC 属性将被您声明的 @property 覆盖。

    属性的指定所有权保留在其元数据中,但除非该属性是合成的,否则其含义纯粹是传统的。如果一个属性是合成的,那么关联的实例变量就是这个实例变量,它可能是由@synthesize 声明隐式命名的。 如果关联的实例变量已经存在,则其所有权资格必须等于属性的所有权;否则,将使用该所有权资格创建实例变量。

    最好避免为您打算@synthesize 的属性声明实例变量。如果您更喜欢具有 不同 名称的实例变量,则可以使用带有 ivar 名称的 synthesize 语法:

    @synthesize myproperty = _myivar;
    

    【讨论】:

    • +1 - 我确定您使用 _myivar 将其与 myproperty 区分开来,但对于新用户,我会指出您显然想要使用 @synthesize var = _var;(其中ivar 与属性同名,只是前面加下划线)。顺便说一句,根据 WWDC 2012 的视频,@synthesize 语句在未来将是可选的,在这种情况下,编译器将使用前面的下划线为您声明 ivar。
    • @RobertRyan 感谢您提供有关即将发布的版本的信息!我一直想知道为什么编译器足够聪明地向我指出缺少的@synthesize 指令,但不够聪明地插入它们。
    【解决方案2】:

    两者都可以工作 - 但是,在较新的架构上,如果您声明一个属性,则不需要专门声明 iVar,因为它是为您完成的。

    这是偏好,真的 - 但是,请确保如果您声明两者,当您直接访问 iVar 或通过 getter 和 setter 时,您会意识到。

    【讨论】:

      【解决方案3】:

      这是个人喜好问题,但我建议不要明确声明 ivars。我在 SO 上看到过人们做过以下事情的情况:

      @interface MyClass
      {
          NSString *var;
      }
      @property (nonatomic, strong) NSString *var;
      @end
      

      然后

      @implementation MyClass
      @synthesize var = _var;
      

      因此,用户显式声明了一个属性和一个同名的 ivar,但随后合成了生成另一个 ivar 的属性(在此示例中,名称中带有前面的下划线),导致生成了两个 ivar .然后他们想知道为什么他们明确声明的 ivar 不起作用。如果您不显式声明您的 ivar,则不会遇到意外以两个 ivar 结束的问题,因为您碰巧在 ivar 显式声明或 @synthesize 语句中输入错误名称。

      只声明属性然后@synthesize ivar 使用另一个名称(通常带有前面的下划线),它是明确的(即如果您忘记引用属性@987654325,您不太可能意外引用您的ivar @ 正确为 self.var) 并且您永远不必担心,例如:

      @interface MyClass
      @property (nonatomic, strong) NSString *var;
      @end
      

      然后

      @implementation MyClass
      @synthesize var = _var;
      

      【讨论】:

        猜你喜欢
        • 2019-12-29
        • 1970-01-01
        • 2017-11-10
        • 2014-11-12
        • 2015-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        相关资源
        最近更新 更多