2012-07-31 24 views
0

代碼1在Objective-C中編寫@property指令的位置?

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

碼2

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

誰能告訴我,什麼是他們之間有什麼不同?並在@property我已經把intwidthheight。爲什麼我們需要在大括號中再次聲明它?

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

+0

這兩者是否存在問題?或者您不確定爲什麼需要將其聲明爲屬性並放在括號中? – 2012-07-31 18:16:05

+0

如果我把{初始寬度,高度},我會得到一些種類的錯誤。 – Ben 2012-07-31 18:18:56

+0

如果你把'{int width,height;}'你得到什麼錯誤?嘗試更具體。 – 2012-07-31 18:20:25

回答

0

在你的例子中,「code1」是正確的,但可能不需要,而「code2」不正確,不會編譯。變量需要大括號中@interface線這就是爲什麼第二個例子是錯誤的之後直接宣佈。

正如一些人已經提到的,你可能不需要申報widthheight都沒有。如果你正在用他現代的運行時編譯器可以從@property聲明中知道你打算爲該屬性設置一個底層實例變量,並且會爲你創建這些變量。另一方面,對於較舊的傳統運行時,必須顯式聲明像widthheight這樣的實例變量。您沒有指定您的平臺,因此在您的情況下是否需要它並不清楚。

現代運行時總是在iOS上使用,這就是爲什麼很多人在這裏會錯誤地告訴你實例變量不需要在任何情況下被聲明。在Mac OS X上,現代運行時與10.5或更新版本的64位代碼一起使用。如果您使用32位代碼或更舊的版本,則需要顯式聲明您的實例變量。

+0

謝謝。真的有助於一個新來objc的人。 – Ben 2012-07-31 18:33:28

0

大括號內的名稱是實例變量,它們可能會或可能不會用作匹配屬性的後備存儲。這取決於你如何寫你的@synthesize陳述。

我寧願沒有明確的實例變量。我在這種情況下使用它們的唯一原因是使調試更容易。

+0

只是好奇,如何聲明明確的Ivars幫助調試?符號顯示更可靠嗎? – 2012-07-31 18:24:50

+0

在Xcode 4中。2(至少)合成的實例變量在擁有對象下的顯示窗口中不顯示(或不一致)。 gdb和lldb在控制檯中也有各種麻煩,包括合成變量的'po'或點符號屬性引用。 (我**剛搬到4.4,並且對是否有調試器修復......很感興趣。) – 2012-07-31 18:29:05

2

您不必重新聲明,只使用:

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

提問者沒有指定操作系統。你說的是不是一般在Mac OS X上是真的。 – 2012-07-31 18:32:04

+0

嗨,我正在使用osx 10.8 64bit – Ben 2012-07-31 18:40:52

+0

哦!對不起,是的,這絕對是iOS。我猜想習慣的力量。 – mprivat 2012-07-31 18:56:36

0

它們之間的區別在於,第一個是正確的,第二個是錯誤的。即使第二個代碼編譯完成,那也不是你應該如何編寫代碼。總是把所有的屬性聲明放在​​ivars之後(大括號中的東西,而@property不聲明變量(這是在大括號中完成的)。@property指令向編譯器提供關於如何生成getter在你的實現文件中使用@synthesize指令時,你應該使用@synthesize指令,並使用setter方法。

+0

所以,我可以跳過那個花括號的東西?對? – Ben 2012-07-31 18:33:02

+0

在這種情況下,是的 – 2012-07-31 18:37:59