是否需要在@interface中声明ivars以匹配属性



可能重复:
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

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

从现代运行时(x86_64和ARM6…以及iOS模拟器(开始,您不再需要声明合成ivar。在第一个示例中,@synthesis为您添加了实例变量。

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

(其中一些惯例变化在早期的WWDC视频中有解释……我认为(

Objective-C编程语言:属性实现指令

访问器合成的行为存在差异,这取决于运行时(另请参阅"运行时差异"(:

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

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

相关内容

  • 没有找到相关文章

最新更新