我对这两个代码段感到困惑:
首先:
//.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
这两个都可以。那么有必要在{}
?
答案 0 :(得分:10)
从现代运行时(x86_64和ARM6 ...和iOS模拟器)开始,您不再需要声明合成的ivars。在第一个例子中,@synthesize正在为你添加实例变量。
答案 1 :(得分:0)
同意@Joshua。我一开始也对此感到困惑。在运行时更新之后,它基本上是旧约定vs新约定。我认为当你要宣布@property时,Apple意识到声明ivars是多余的,所以为什么不让@synthesize在它创建setter和getter时处理它。我们写的少一句话,耶!
(其中一些会议变更在之前的WWDC视频之一中进行了解释......我认为)
答案 2 :(得分:0)
The Objective-C Programming Language: Property Implementation Directives
访问者合成的行为有所不同,这取决于运行时(另请参阅“运行时差异”):
对于旧版运行时,实例变量必须已在当前类的@interface块中声明。如果存在与该属性同名的实例变量,并且其类型与属性的类型兼容,则使用它 - 否则,您将收到编译器错误。
对于现代运行时(请参阅Objective-C运行时编程指南中的“运行时版本和平台”),可根据需要合成实例变量。如果已存在同名的实例变量,则使用它。