2011-09-21 56 views
8

就我所知,@property聲明瞭.h文件中的getter和setter,@synthesize實現了.m文件中的getter和setter。此外,可以爲getter和setter編寫自己的實現,而不是使用@synthesize。Objective-C:@property聲明沒有實現(@synthesize)

所以如果我們總是需要實現setter/getter爲什麼我們需要另外聲明它呢? @property似乎對我來說是語義冗餘的,也是bug的來源。

當我聲明@property時會發生什麼,但忘記用@synthesize或手動實現它?當我使用@synthesize並忘記@property聲明時會發生什麼?

回答

26

屬性現在默認合成,因爲Xcode 4.4,所以是的,你是對的,它是多餘的,Apple刪除了同時編寫@property和@synthesize的需求,從現在起使用@property。

+0

不錯,他們加了這個。感謝您的迴應 –

+8

還有一種情況,您需要同時使用屬性和合成。編譯器將使用屬性名稱加下劃線前綴來創建伊娃。如果ivar _propertyname與私有實例變量衝突,則需要將其合成到新的ivar。例如:如果您是UIToolbar的子類,並聲明瞭一個命名它的委託屬性,您將嘗試使用ivar _delegate時會出錯,因爲UIToolbar包含一個私有實例變量id _delegate。你可以通過使用'@synthesize delegate = _mydelegate;'來解決這個問題。 – lolol

4

當我聲明@property但是忘記用@synthesize或手動執行 時會發生什麼?當我使用@synthesize和 忘記@property聲明時會發生什麼?

你爲什麼不試試?如果您忘記綜合訪問器或提供自己的參數,編譯器會警告您。 (如果你已經設置了將警告視爲錯誤,這是一個好主意,不可能錯過警告。)第二種情況通常會導致編譯錯誤。

所以如果我們總是需要執行setter/getter爲什麼我們需要 additionaly聲明呢? @property似乎對我來說是語義上的冗餘,也是bug的來源。

簡單來說,@property是屬性聲明,@synthesize是一種可能的實現。一個屬於頭部(= public interface description),另一個屬於實現文件。如果不是這樣,你會怎麼做?具有低於在.h文件中

@property (retain, nonatomic) NSString* userName; 

6

-(NSString*)userName; 

-(void)setUserName:(NSString*)userName; 
在.h文件

語法糖中的.m

@synthesize是語法糖離開自己的尊重您的retainnonatomic等,如您的財產聲明中所述。

即使您在.h文件中指定了合適的getter,setter簽名,您也無法用out @property進行合成。

但是你可以離開@synthesize並實現你自己的getter和setter。

如果您同時執行了@synthesize和您的自定義getter setter,則運行時將遵守您的實現並調用相同的方法。

+0

很好的解釋 – onmyway133

2

只是想補充一點,你也可以使用@dynamic而不是@synthesize,儘管這很少是你需要做的事情。 @dynamic基本上是告訴編譯器,你是不知何故將確保在運行時調用getters和setters,或者自己做或者通過做一些額外的混亂Objective C運行時的特殊功能。

+0

我對這個「莫名其妙」感興趣。我想用字典支持一些點式屬性,並且完全失敗。可能是一個問題的成果。 –