0

代码1

@interface Rectangle : NSObject   
{
    int width,height;
}
@property int width,height;

代码2

@interface Rectangle : NSObject
@property int width,height;
{
    int width,height;
}

谁能告诉我,他们之间有什么不同?在@property我已经提出intwidthand height。为什么要在大括号中再次声明?</p>

更新:我使用的是 osx 10.8 64bit。

4

4 回答 4

2

您不必重新声明,只需使用:

@interface Rectangle : NSObject
@property int width,height;
@end
于 2012-07-31T18:21:39.343 回答
0

大括号内的名称是实例变量,可能会也可能不会用作匹配属性的后备存储。这取决于你如何写你的@synthesize陈述。

我宁愿根本没有显式的实例变量。我在这种情况下使用它们的唯一原因是使调试更容易。

于 2012-07-31T18:20:28.063 回答
0

它们之间的区别在于,第一个是对的,第二个是错的。即使第二个代码编译,这也不是您应该编写代码的方式。始终将所有属性声明放在​​ ivars 之后(大括号中的内容。@property 不声明变量(在大括号中完成)。@property 指令向编译器提供有关如何生成 getter 的说明和 setter 方法,当你使用 @synthesize 指令时,你应该在你的实现文件中这样做。

于 2012-07-31T18:23:43.713 回答
0

在您的示例中,“code1”是正确的,但可能不需要,而“code2”不正确,不会编译。任何实例变量都需要在@interface 行之后直接在大括号中声明,这就是第二个示例错误的原因。

正如其他一些人提到的那样,您可能根本不需要width声明height。如果您使用的是现代运行时,编译器可以从@property语句中看出您打算为该属性创建一个底层实例变量,并将为您创建这些实例变量。另一方面,对于较旧的遗留运行时,实例变量喜欢width并且height必须显式声明。您没有指定您的平台,因此不清楚您的情况是否需要它。

现代运行时总是在 iOS 上使用,这就是为什么这里很多人会错误地告诉你实例变量在任何情况下都不需要声明。在 Mac OS X 上,现代运行时与 10.5 或更高版本中的 64 位代码一起使用。如果您使用的是 32 位代码或旧版本,则需要显式声明您的实例变量。

于 2012-07-31T18:30:07.903 回答