爲什麼要用@dynamic

如果不想讓編譯器自動合成存取方法,我們可以自己實現。如果我們只實現了其中一個存取方法,那麼另外一個還是由編譯器來合成。還有一種方法能阻止編譯器自動合成存取方法,就是使用**@dynamic**關鍵字。
它會告訴編譯器:不要自動創建實現屬性所用的實例變量,也不要爲其創建存取方法。此外,在編譯訪問屬性的代碼時,即使編譯器發現沒有定義存取方法,也不會報錯,它相信這些方法能夠在運行期找到。
比如說:如果從CoreData框架中的NSManagedObject類裏繼承了一個子類,那麼就需要在運行期動態創建存取方法。繼承NSManagedObejct時之所以要這樣做,是因爲某些屬性不是實例變量,其數據來源後端數據庫。

@interface EOCPerson : NSManagedObject
@property NSString *firstName;
@property NSString *lastName;
@end

@implementation EOCPerson
@dynamic firstName,lastName;
@end

編譯器不會爲上面這個類自動合成存取方法和實例變量。如果用代碼訪問其中的屬性,編譯器也不會發出警示信息。

來源:Effective Objective-C 2.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章