可能重复:
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运行时编程指南中的"运行时版本和平台"(,实例变量是根据需要合成的。如果已经存在同名的实例变量,则使用该实例变量。