在Objective-C中编写@property指令的位置?

时间:2012-07-31 18:14:43

标签: objective-c properties compiler-directives

CODE1

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

码2

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

谁能告诉我,他们之间有什么不同?在@property我已经为intwidth添加了height。为什么我们需要在大括号中再次声明它?

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

4 个答案:

答案 0 :(得分:2)

您无需重新声明,只需使用:

@interface Rectangle : NSObject
@property int width,height;
@end

答案 1 :(得分:0)

大括号内的名称是实例变量,可能会也可能不会用作匹配属性的后备存储。这取决于您编写@synthesize语句的方式。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在你的例子" code1"是正确但可能不需要的,而" code2"是不正确的,不会编译。任何实例变量都需要在@interface行之后直接在大括号中声明,这就是为什么第二个例子是错误的。

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

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