【问题标题】:Is it necessary to declare ivars in @interface to match properties? [duplicate]是否有必要在@interface 中声明 ivars 以匹配属性? [复制]
【发布时间】:2012-01-09 22:38:39
【问题描述】:

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

我对这两个代码段感到困惑:

第一:

//.h
@interface Student : NSObject {

}
    @property (nonautomic, copy) NSString *name;
    @property (nonautomic, retain) NSNumber *age;
@end

//.m
@implementation Student
    @synthesize name;
    @synthesize age;
@end

第二:

//.h
@interface Student : NSObject {
    NSString *name;   // <<============ difference
    NSNumber *age;    // <<============ difference
}
    @property (nonautomic, copy) NSString *name;
    @property (nonautomic, retain) NSNumber *age;
@end

//.m
@implementation Student
    @synthesize name;
    @synthesize age;
@end

这两种方法都可以。那么有必要在{}中声明变量吗?

【问题讨论】:

  • 您的属性应标记为nonatomic,而不是nonaUtomic
  • @5StringRyan 这个问题需要你了解运行时有多个版本,这来自不同的知识水平。
  • @JoshuaWeinberg - 我不明白,他问“那么是否需要在 {} 中声明变量”,我指出的 SO 帖子的创建者说,“这仍然有效吗? ?” (指创建没有 ivars 的属性)。此外,该帖子中接受的答案与您的答案非常相似。
  • 哦,我理解并同意答案是相同的,但问题却大不相同:)

标签: objective-c interface properties instance-variables


【解决方案1】:

从现代运行时(x86_64 和 ARM6...和 ​​iOS 模拟器)开始,您不再需要声明合成 ivars。在第一个示例中,@synthesize 正在为您添加实例变量。

【讨论】:

    【解决方案2】:

    同意@Joshua。一开始我也对这个感到困惑。运行时更新后,这基本上是旧约定与新约定。我认为 Apple 意识到在您要声明 @property 时声明 ivars 是多余的,所以为什么不让 @synthesize 在创建 setter 和 getter 时处理它。让我们少写一个声明,耶!

    (其中一些约定更改在早期的 WWDC 视频之一中进行了解释......我认为)

    【讨论】:

      【解决方案3】:

      The Objective-C Programming Language: Property Implementation Directives

      存取器综合的行为因运行时而异(另请参阅“运行时差异”):

      • 对于旧版运行时,实例变量必须已在当前类的 @interface 块中声明。如果存在与属性同名的实例变量,并且其类型与属性的类型兼容,则使用该变量,否则会出现编译器错误。

      • 对于现代运行时(参见 Objective-C 运行时编程指南中的“运行时版本和平台”),实例变量是根据需要合成的。如果同名的实例变量已经存在,则使用它。

      【讨论】:

        猜你喜欢
        • 2015-09-05
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        相关资源
        最近更新 更多