如果不想讓編譯器自動合成存取方法,我們可以自己實現。如果我們只實現了其中一個存取方法,那麼另外一個還是由編譯器來合成。還有一種方法能阻止編譯器自動合成存取方法,就是使用**@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