2010-07-18 85 views
2

我在最新的iOS SDK中使用帶有核心數據的示例導航視圖模板。有人可以解釋這個@synthesize語法嗎?

rootViewController.m文件我看到這個在@synthesize行:

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_; 

凡頭文件是:

@private 
NSFetchedResultsController *fetchedResultsController_; 
NSManagedObjectContext *managedObjectContext_; 

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 

,這是否意味着他們都是合成的(創建獲取者&設置者),但是一個是設置爲等於另一個?它也似乎fetchedResultsController也是rootViewController.m文件中的一種方法。

此模板在此SDK版本中發生了變化,我正在關注Apress書籍更多iPhone 3開發,這真的令人困惑。

回答

-1

只有第一個(在合成語句的lhs)與getter和setter合成,併成爲「公共」實例變量。

後者(帶下劃線)在實例內仍然可用,但不會暴露在實例之外。它們都引用相同的內存地址。

+0

好吧,這是有道理的,所以也是我的理解是,公共實例也加載時調用同名的方法?看起來很奇怪,特別是對於Apple文檔中的示例應用程序! 我不知道什麼是調用fetchedResultsController方法。 – JMWhittaker 2010-07-19 08:05:39

3

@synthesize語法中,=的左側(這僅僅是綜合使用這個語法,而不是賦值運算符的角色)是財產(和相關方法)的名稱, =的右側是用於指定屬性的實例變量。

在上述例子中,@synthesize fetchedResultsController=fetchedResultsController_創建fetchedResultsController getter方法和setFetchedResultsController: setter方法,無論使用用於存儲的fetchedResultsController_實例變量。

同樣,@synthesize managedObjectContext=managedObjectContext_創建managedObjectContextsetManagedObjectContext:存取方法,通過managedObjectContext_實例變量都支持。

如果沒有明確指定「右側」(如果聲明爲@synthesize fetchedResultsController, managedObjectContext;,合成將假定實例變量的名稱與該屬性相同。有些Objective-C程序員不喜歡把它留在這個默認行爲上,因爲它可能很容易出錯,打算設置本地函數範圍變量,而是改爲設置一個實例變量。對所有實例變量使用下劃線使他們的意圖更清晰。

只是要清楚,多個@synthesize屬性可以通過逗號分隔組合成一個屬性;每個仍是其自己的聲明使得上述完全等同於:

@synthesize fetchedResultsController=fetchedResultsController_; 
@synthesize managedObjectContext=managedObjectContext_; 

也沒什麼看頭,在新的Xcode中/ IOS版本的實例變量時,自動將沒有明確定義創建和@synthesize聲明還假設如果沒有指定。這些差異在Apple的快速參考Objective-C Feature Availability Index中解釋。

相關問題