【问题标题】:Objective C multiple declarations of instance variables / propertiesObjective C实例变量/属性的多重声明
【发布时间】:2012-06-14 13:10:49
【问题描述】:

我对 ObjC 还是很陌生。我注意到在任何地方都可以很标准地创建您的

@interface myObj : NSObject {
    id delegate;
    NSDictionary *dict;
}

然后

@property (nonatomic,retain) NSDictionary *dict;
@property (retain) id delegate;

——例如。我知道 @property 的自动代码生成 + 更清晰的定义是多么有用,这要归功于 Apple 的 Declared Properties 页面。然而,我不明白的是,为什么人们同时做这两个是标准的 - 声明他们的属性,然后将它们再次放在{花括号}中。

我的意思是,如果我有一个类,其中我希望一些变量具有自动 getter/setter 而一些不具有,那么我会理解为我的常规变量设置 {} 块,然后只创建 @property/@仅针对我想要添加的功能的那些特定变量综合语句;但是,为什么在您知道希望所有实例变量都具有 getter 和 setter 的情况下始终同时拥有这两种方法是标准的呢?我想我要跳闸了,因为我基本上 100% 都看到它像这样使用,而我觉得它真的没有必要......只需声明 @properties 并保留它。

想法?最佳编码实践建议?还是我在这里遗漏了一些信息?

【问题讨论】:

  • 我将 IBOutlet 排除在括号之外,以此来组织我对班级真正拥有的东西的想法。但这只是我。

标签: objective-c automatic-properties


【解决方案1】:

您所看到的在早期版本的 Objective-C 中是必需的,但现在不再需要了。

在 NeXT 使用的第一个 Objective-C 版本中,直到引入新的运行时(在 Mac OS X 上使用 Objective-C 2.0),所有实例变量都必须在其 @987654321 中声明为类结构的一部分@。原因是,如果你对一个类进行子类化,编译器需要知道类的实例变量布局,以便它可以看到放置子类的实例变量的偏移量。

当引入属性时,合成属性必须由类结构中的实例变量“支持”。因此,您必须同时声明实例变量和属性。

以上所有内容都不再正确。较新的 Objective-C 在查找实例变量偏移的方式上不那么脆弱,这意味着一些变化:

  • 并非所有实例变量都需要在@interface 中。它们现在可以在 @implementation: 中定义,但由于可能发生冲突和其他问题,因此不在类别中。
  • 可以根据属性定义推断和创建合成属性的实例变量。
  • 您可以在运行时以编程方式将实例变量添加到您正在创建的类中(仅在您将该类注册为系统可用之前)。

因此,重申一下,您只需要在旧版本的 Objective-C 语言中同时声明实例变量和综合属性。您看到的内容是多余的,不应被视为“最佳做法”。

【讨论】:

    【解决方案2】:

    我倾向于将属性视为我的公共变量,而其他人则视为私有变量,但是,当您说“真的没有必要”时,您是对的。

    如果省略 ivar,仍会创建 ivar

    我创建了两个,以便我所有的 ivars 都在一起,并且在接口声明之后的大括号内

    @interface MyClass
    {
        int variable1;
    }
    @end
    

    【讨论】:

    • 不真实。您可以直接访问实例变量,即使它是作为合成属性的结果创建的并且没有在类中以其他方式声明。
    • 所以你可以!没想到。
    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 2014-03-16
    • 2013-09-17
    • 2010-12-05
    • 1970-01-01
    • 2012-07-12
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多