【问题标题】:Objective-C: Xcode automatically recognizes ' = _property ": is this @synthesize created variable name?Objective-C: Xcode 自动识别 ' = _property ": 这是@synthesize 创建的变量名吗?
【发布时间】:2011-10-12 14:02:29
【问题描述】:

当您声明 @property@synthesize 它时,使用以下方法被认为是一种好习惯:

@synthesize myProperty = _myProperty;

我注意到 Xcode 会为您自动完成 ivar 名称 _myProperty,即使它尚未在源代码中使用。

这是因为 ivar @synthesize 自动创建默认名称为 _myProperty?还是仅仅因为 Xcode 支持这种带有自动补全功能的通用约定?

谢谢。

编辑:我不是在寻找为什么这是良好做法的原因;我已经知道这些并且已经使用了一段时间。我想了解内部结构,因此我想问这是否是满足约定的硬编码自动完成规则,或者它是否是标准自动完成,实际上 Objective-C 规范规定由@synthesize 生成的 ivar必须具有_myProperty 的形式,因此在ivar 的幕后生成之后,自动完成就知道它的存在。谢谢!

【问题讨论】:

    标签: objective-c xcode autocomplete ivar


    【解决方案1】:

    我认为自动补全是 IDE 的便利,而不是运行时的结果。我对此的逻辑是以下似乎是有效的:

    @interface SomeClass()
    @property (nonatomic, assign) int unpublishedInstanceVariable;
    @end
    
    @implementation SomeClass
    @synthesize unpublishedInstanceVariable;
    
    - (void)someMethod
    {
        unpublishedInstanceVariable = 3; // not calling the setter
    }
    @end
    

    【讨论】:

      【解决方案2】:

      硬编码的自动完成规则以满足约定

      如果您没有明确指定 iVar 名称,它将被称为 myProperty。自动完成与编译器没有任何关系,只是 Xcode 更有帮助。

      【讨论】:

      • @synthesize 为您生成一个 ivar 作为预编译步骤,这就是我想检查的原因。谢谢。
      • 编译器是为你合成iVar的东西,这就是我提到它的原因。当然,您没有明确提到编译器。
      • 所以这是实际的编译,而不是预处理步骤?
      • 是的,绝对是编译器。
      【解决方案3】:

      从 Xcode 4.4 开始,尾部有了新的变化 (sic)。

      • 我们现在可以完全跳过@synthesize。在这种情况下,编译器会自动为我们生成@synthesize foo = _foo; 声明,实例变量名称带有下划线前缀。

      @interface Foo : NSObject
      @property (nonatomic, copy) NSString *foo;
      @end
      
      @implementation Foo
      - (void)bar {
          NSLog(@"%@", _foo); // this Works!
      }   
      @end
      
      • 但是,如果我们确实有明确的@synthesize 语句但没有指定实例变量的名称,那么实例变量的默认名称与属性的名称相同,即不带下划线前缀,在这种情况@Tommy 的回答仍然成立。

      如果有人能指出记录此行为的官方 Apple Docs 的链接,那就太好了。

      更新

      我的发现是正确的。这种行为(@synthesize 是默认行为,并在没有显式综合等情况下创建支持下划线前缀的实例变量等)在 WWDC 2012 Session 405 - Modern Objective-C 中公开宣布。

      【讨论】:

      • 你的意思是“故事”。这是另一个 IDE 便利,还是最新 Objective-C 版本的一个特性?
      • @KomodoDave LLVM 做到了,所以我称之为 Objective-C 功能 (useyourloaf.com/blog/2012/08/01/…)
      【解决方案4】:

      写下你的这部分问题:

      是否……实际上是 Objective-C 规范规定 @synthesize 生成的 ivar 必须具有 _myProperty 表单,

      您可以为您的 ivar 命名任何您想要的名称。来自文档:

      您可以使用 property=ivar 的形式来指示特定的 属性应使用实例变量,例如:

      @synthesize firstName, lastName, age=yearsOld; 
      

      这指定 firstName、lastName 和 age 的访问器方法应该是 合成并且属性年龄由实例表示 可变年。

      还有,

      @synthesize 指令还会合成一个适当的实例变量,如果它没有另外声明

      【讨论】:

        猜你喜欢
        • 2012-02-17
        • 2011-08-16
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多