2012-10-04 90 views
8

我對Objective C非常陌生(現在兩天了)。當讀到@synthesize時,它似乎與我的理解@property(我認爲我理解)重疊...因此,我需要在腦海中解決一些細節......它在擾亂我。@property和@synthesize

請糾正我,如果我錯了有關@property@synthesize差異:

如果您在@interface聲明@property,然後你告訴世人,用戶可以期望使用標準的getter和setter該財產。此外,XCode將爲您製作泛型getter和setter。 ...但是,在@property聲明時發生了什麼? (IE瀏覽器,在您的@interface

- 或 -

表示「完全」 ......像它看不見的聲明在@interface,也看不見代碼並@property照顧看不見的代碼中的聲明在你的@interface只 - 而@synthesize負責看不見的代碼實現在你的@implementation節)

+3

想象一下,如果你有一個'@屬性'而不是你可能需要'@ synthesize'。這是因爲'@ property'告訴世界需要一個通用的'getter'和'setter',但'@ synthesize'實際上是創建'getters'和'setters',你可以覆蓋它並創建你自己的'getters'和'setters'如果你喜歡,因爲生成的將是非常基本的。看看保羅·赫加迪的iTunesU'iPad和iPhone應用程序開發「這是我想到的方式,它還沒有失敗。 – Popeye

+0

非常感謝Popeye ... iTunes U很棒!我實際上在第四課或保羅的2011系列中。我只是備份,閱讀XCode 4學習目標C以及這些系列的內容......但這並不明確。 – RichWalt

回答

7

@property聲明與您提供力所能及的原子和setter語義類的屬性。

隨着Xcode 4.4,自動合成是可用的,其中你從你的財產提供一個支持伊娃沒有聲明它在@synthesize。該ivar的形式爲_propertyName,其中您的房產名稱爲propertyName

+0

這已經擊中了頭部,短暫的甜美和簡單。 +1 – Popeye

+0

是的......我知道你可以用一個不同的伊娃(這應該是你的班級使用的,特別是獲得者和制定者的名字)「支持你的財產變種」......非常感謝你的迴應。 ..我已經對......有幫助的回覆的速度感到不知所措(這是我加入分鐘前的第一篇文章)! - 感謝您抽出時間發表這篇文章Alan! – RichWalt

16

首先,請注意最新版本的Xcode不再需要@synthesize了。你可以(也應該)只是省略它。這就是說,這些是件做什麼。

@property是訪問者聲明。這只是一個聲明。

@property (nonatomic, readwrite, strong) NSString *something; 

- (NSString *)something; 
- (void)setSomething:(NSString)aSomething; 

的主要區別在於,使用@property聲明這些方法可以讓編譯器自動生成(合成)的實現你:有下列差別很小的。沒有要求你讓編譯器爲你做。您完全可以自由地手動執行somethingsetSomething:,這是很常見的做法。但是,如果你不手動實現它們,編譯器會自動爲你創建一個叫做_something的ivar,併爲getter和setter創建一個合理的實現。

在舊版本的Xcode中,您必須使用@synthesize關鍵字明確請求自動生成。但這不再是必需的。今天,使用@synthesize的唯一理由是,如果您希望伊娃擁有非標準名稱(永遠不要這樣做)。

一個關鍵這裏的一點是,這些方法somethingsetSomething:只是方法。他們沒有什麼神奇的。他們不是特殊的「財產方法。「他們只是按照慣例進入一片狀態的那件狀態通常存儲在伊娃的方法,但並不需要是

爲了更加明確:。object.something平均」從object返回名爲_something伊娃。」它的意思是‘返回[object something]的結果,不管這呢。’這是很常見的,要返回伊娃的價值。

你應該申報所有狀態的(內部和外部)使用@property聲明,並且您應該避免直接聲明ivars。您還應該始終通過訪問者訪問您的屬性(self.something),除了initdealloc方法。在initdealloc,你應該直接使用伊娃(_something)。

+0

Rob,非常感謝您的時間和迴應。從去年(2011年)在iTunes U上觀看iOS視頻......並試圖跟上XCode中發生的變化,有時會造成一些混亂。仔細聆聽指導員,甚至用簡單的代碼進行測試......哎喲,即使閱讀XCode文檔也沒有完全清楚@synthesis是沒有必要的!像你這樣有用的確認增加了我沒有學會錯誤的信心......隨着我繼續前進。 :-)現在......如果有人有一些外部鏈接,我可以開始正確地思考MVC - 那太棒了! – RichWalt

+0

從這裏開始:http://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html%23//apple_ref/doc/uid/ TP40010810-CH14。然後在這裏:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457 –

+0

我正在看着這個吧!太感謝了!!!! – RichWalt

相關問題