是否有必要在@interface中声明ivars以匹配属性?

时间:2011-11-30 17:26:38

标签: objective-c interface properties instance-variables

  

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

这两个都可以。那么有必要在{}

中声明变量

3 个答案:

答案 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运行时编程指南中的“运行时版本和平台”),可根据需要合成实例变量。如果已存在同名的实例变量,则使用它。

  •