2012-05-31 77 views
2

我開始學習Objective-C和我有一個問題:聲明類屬性的Objective-C

當你聲明一個類的屬性,就是這樣的區別?

第一種情況:

@interface ViewController : UIViewController 
{ 
UILabel *label; 
} 
@property(nonatomic,retain) UILabel *label; 
@end 

第二種情況:

@interface ViewController : UIViewController 
{ 

} 
@property(nonatomic,retain) UILabel *label; 

@end 

在第一種情況下,我聲明瞭一類具有一個屬性(*的UILabel標籤),後來,我聲明瞭該標籤的屬性。

在第二種情況下,我只聲明屬性。 我一直認爲我應該聲明類屬性。

+2

[Property Declaration and Automatic Backing Storage Allocation]的可能重複(http://stackoverflow.com/questions/3238009/property-declaration-and-automatic-backing-storage-allocation) – outis

+0

Ups!抱歉!! :( – dpbataller

回答

2

在第一種情況下,我宣佈一個類與一個屬性(UILabel *標籤),後來,我宣佈該標籤的屬性。

不,你不是。在第一種情況下,您正在聲明名爲label的實例變量和一對名爲-setLabel:-label(共同稱爲屬性)的訪問器方法。您沒有在屬性和實例變量之間建立鏈接。他們在這一點上是獨立的實體。

如果您在執行此操作:

@synthesize label = fooBar; 

您是說標籤屬性的方法實際使用一種完全不同的實例變量來支持財產。

我一直以爲我應該聲明類屬性

我以前想的一樣,但實際上,如果你是合成的財產,有一個在分別宣佈伊娃沒有意義,因爲@synthesize會爲你做(並在ARC將應用正確的所有權限定符)。我現在做這樣的事情:

@synthesize label = label_; 

所以當我的意思是使用屬性我不使用的實例變量。例如[label length]標記錯誤時,我的意思是[[self label] length]

此外,如果您更改該屬性的實施不使用實例變量,如果您沒有明確聲明實例變量,它將消失並意外使用它( +那些在initdealloc)將被標記爲錯誤。

+0

我認爲我有一個概念問題 我們的Java老師教會了我們,類有屬性和方法 所以我認爲它UILabel *標籤將是類ViewController的一個屬性, 我應該怎麼調用?實例變量或屬性? – dpbataller

+0

@dpbataller這是一個我認爲的術語問題,一個類的實例附加的變量稱爲「實例變量」,方法稱爲「方法」,沒有「類」變量,但有實例方法和類方法通過實例方法,receiver(方法內部的self)是類的一個實例,通過類方法,receiver(self)是代表類本身的對象。 – JeremyP

0

尚未提及的另一個不同之處:

在你的第一種情況下,label保護了訪問。如果沒有另外聲明,則實例變量默認爲@protected

另一方面,在第二種情況下,label是私人的(至少在我的編譯器中)。

當你有子類時,這個區別很重要。