2012-12-30 6 views
1

我正在使用幾個Core Data實體生成NSManagedObject子類,並且在生成這些類時我選擇了「對基元數據類型使用標量屬性」選項。正如預期的那樣,整數屬性被聲明爲int16_t性能和浮點屬性被聲明爲float特性在生成的接口:當我不爲Core Data標量屬性編寫訪問器方法時會發生什麼?

@interface TeamStats:NSManagedObject 
@property (nonatomic) int16_t pointsScored; 
@property (nonatomic) float winPercentage; 
@end 

在這個界面生成的實現,我看到聲明的@dynamic這些屬性:

@implementation TeamStats 
@dynamic pointsScored; 
@dynamic winPercentage; 
@end 

現在,根據Core Data文檔,我需要爲這些標量屬性編寫訪問器方法,因爲Core Data無法爲我生成它們:

您可以將屬性聲明爲標量值,但對於標量值,核心數據不能動態生成訪問器方法 - 您必須提供自己的實現(請參閱 「託管對象訪問器方法」(第44頁))。核心數據自動合成原始訪問器方法(primitiveLength和setPrimitiveLength :),但您需要 聲明它們以禁止編譯器警告。

這一切都合情合理,我可以看到許多SO帖子,詢問如何寫入這些存取方法,並帶有許多很好的答案。

我無法弄清楚的是:我編寫了這段代碼,並在我閱讀過文檔中的這些細節之前開始使用它,所以我從來沒有寫過任何存取方法。我只在我的類實現中有@dynamic聲明。儘管沒有編寫我應該需要的訪問器方法,但代碼看起來工作得很好。我已經創建了NSManagedObject子類的實例。我已發送該類的實例a setPointsScored:pointsScored消息,並將生成的實例保存到其持久性存儲中。一切似乎都奏效。

我在這裏錯過了什麼?是否有默認實現正在生成,儘管核心數據文檔中提到了什麼?是否會出現我當前的代碼無法工作的情況,需要注意?我希望在編碼更多NSManagedObject子類之前瞭解這裏發生了什麼......

+0

呃......我不寫這些......我認爲CoreData實際上負責爲你創建它們嗎? –

+0

它現在確實存在,文檔錯誤 –

回答

5

爲原始數據類型創建標量存取器是Xcode 4引入的一個功能,但顯然沒有很好的記錄。它在WWDC 2011年會議的視頻中提到

  • 「303最新iOS上的核心數據」(幻燈片95)
  • 「315什麼的核心數據在Mac OS X中的新增」(幻燈片90)

根據這些會話的信息,標量訪問器避免了構造NSNumber對象的開銷,所以它們比「核心數據編程指南」中顯示的實現更有效率。

所以要回答你的問題:標量屬性的默認訪問器是自動生成的。關於此功能,「核心數據編程指南」已過時。

+0

感謝您的參考,Martin--文檔看起來可能已過時,但知道Apple至少在某處提到這一更改令人欣慰。 –

相關問題