2011-07-14 22 views
0

我在這裏讀了一些教程有關屬性,但我仍然有一些疑問澄清,是否有我是否需要在實例變量部分聲明一個屬性?我得到什麼?

@interface MyClass : NSObject {  
} 
@property(nonatomic,retain) NSString *temp; 
@end 

@interface MyClass : NSObject { 
    NSString *temp; 
} 
@property(nonatomic,retain) NSString *temp; 
@end 
+0

對不起,我試過了,無法把代碼放在正確的格式。我試圖把它放在{}中仍然沒有工作。我不知道如何。這方面的任何提示? – Rajashekar

+0

您不必在{}中放置代碼。而是粘貼代碼,選擇它並單擊{},這是一個位於文本字段上方的按鈕。 – Codo

+0

@codo謝謝,現在我明白了。對不起,我正在嘗試像cocos2d論壇那樣做。 – Rajashekar

回答

0

不同的是,在第一個版本,編譯器會自動創建一個實例變量(IIRC,它將被命名爲_temp,但我不確定)。這僅在iOS和Mac 64位上受支持。

在第二個示例中,您提供了該變量。

實際上,有一種方法來告訴編譯器使用的屬性,該屬性變量,我用了很多:

@interface MyClass : NSObject { 
    NSString *temp_; 
} 
@property(nonatomic,retain) NSString *temp; 
@end 

@implementation MyClass 
@synthesize temp = temp_; 
@end 

這樣的變量和屬性有不同的名稱,你不能混淆(例如忘記前綴self.)。

小副注:經常需要使用copy而不是retain代替NSString *,因爲您可能會將NSMutableString *指定給該屬性。現在如果你想改變那個可變的字符串,可能會發生意外的事情。

0

是否第一個連工作之間的區別嗎?如果沒有實例變量,它有點難以擁有一個屬性來訪問它。

@properties都是爲了你,所以你可以偷懶,他們寫了以下2種方法爲你(如果沒有設置爲只讀):

- (void)setYourVariable:(id)new; 
- (id)yourVariable; 

它也允許你使用「someClass.itsVariable ;」而不是「[someClass itsVariable];」另一件事,當你創建你的頭文件時,確保最大的變量(如指針)在頂部和底部最小,這樣可以節省內存。

這樣的:

NSObject *someObject; 
NSObject *someOtherObject; 

int anInt; 
short aShort; 
BOOL fakeBool; 

代替:

BOOL fakeBool; 
NSObject *someObject; 
short aShort; 
NSObject *someOtherObject; 
int anInt; 

這與編譯器做的,你可以使用的sizeof()檢查此

+0

是的,第一個可以在iOS和Mac 64位上運行,但不能在Mac 32位上運行。編譯器爲您生成一個實例變量。順便說一句,我不相信你關於節省空間的言論是真的,你可以用一些鏈接來支持它嗎?因爲編譯器應該以CPU方便的方式對齊變量,重新排序不會改變所用空間的數量。 – DarkDust

+0

@DarkDust嘗試一下,找到它,這是真的。使用sizeof() –

+1

@DarkDust當我有2個NSStrings沒有頂部,2個布爾值的底部它有一個32的大小,當我做他們在隨機順序,布爾指針指針布爾它是40 –

0

在現代運行時(Objective-C 2.0)中,它是相同的,因爲編譯器會爲您生成變量。見Question about @synthesize

引述Objective-C編程語言>屬性聲明>Property Implementation Directives

有在訪問合成的行爲差異是 依賴於運行時:

  • 對於傳統運行時,實例變量必須已經在當前類的@interface塊中聲明。如果一個實例 與該屬性同名的變量存在,並且其類型爲 與該屬性的類型兼容,則使用它 - 否則,將得到一個 編譯器錯誤

  • 對於現代運行時,實例變量根據需要進行合成。 如果同名的實例變量已經存在,則使用 。

0

的實際區別,我已經發現的是,調試器不會出現,顯示性能,只是實例變量的值。

因此,您的第一個示例(假設您使用@synthesize指令創建您的getter/setter)會自動創建ivar,但它不會具有可在調試期間輕鬆檢索的值。您最終不得不發送大量的NSLog消息,而不是在單步執行代碼時查看這些值。作爲一個旁白,這似乎與這個主題有關,我通常在iv代碼前添加我的ivars並在XCode首選項中更改我的顏色設置,這樣我就永遠不會確定我是在訪問一個屬性還是一個ivar 。

@interface MyClass : NSObject { 
    NSString *ivName; 
    NSString *ivTitle; 
} 
@property (nonatomic, copy) NSString *Name; 
@property (nonatomic, copy) NSString *Title; 
@end 

現在,這則需要一個小竅門(綁兩人在一起)合成的屬性,這一點我下面展示的時候:

@implementation MyClass 
@synthesize Name = ivName; 
@synthesize Title = ivTitle; 

這樣一來,它的一直很容易讓我一眼就知道到底發生了什麼。是的,上下文還可以告訴你是否訪問ivar/property,但爲什麼不能更容易?

相關問題