- @synthesize:如果不實現setter和getter方法,將按照編譯器的規則自動生成setter和getter方法.
- @dynamic:直接或動態的執行setter和getter方法.通常自己實現setter和getter方法,我們基本上不會用到.
@dynamic
關鍵詞的場景,之前@dynamic只在NSManagedObject的子類中遇到過,因爲NSManagedObject的子類是由CoreData直接生成的,其中對應參數(@property)的setter和getter方法也是由CoreData直接生成,並且不展現給你。
Setter & Getter
首先介紹一下什麼是setter和getter方法:
由名字也大致能猜出
getter方法是當你的程序某處讀取一個參數A的時候,會調用的方法,它會返回當前A的值
setter方法是當你的程序某處給參數A賦值的時候,會調用的方法,把新值賦值給變量A
接下來,我們看一個標準的setter && getter方法
@interface Sample()
@property(nonatomic, strong, readwrite)NSObject *sampleObject;
@end
@implementation Sample
@synthesize sampleObject = _sampleObject;
//getter
- (NSObject *)sampleObject
{
return _sampleObject;
}
//setter
- (void)setSampleObject:(NSObject *)sampleObject
{
_sampleObject = sampleObject;
}
@end
以上就是一個比較標準的setter以及getter方法
其中用到了我們要講的一個關鍵詞
@synthesize
synthesize中文意思爲‘合成’,在編譯的過程中,編譯器會幫你自動生成getter和setter方法,也就是說,上述代碼中,把
- (NSObject *)sampleObject
- (void)setSampleObject:(NSObject *)sampleObject
兩個函數的實現刪除掉也是沒有關係的。因爲@synthesize語法糖會讓編譯器幫助你生成getter和setter方法
而現在的編譯器(XCode6),即使你不寫@synthesize,它同樣會自動幫你生成getter和setter方法,但是具體是從哪個版本開始的我還沒有查到。
而語法糖@synthesize的寫法也很有深意
@synthesize sampleObject = _sampleObject;
可以看出sampleObject是我們的參數名稱,而_sampleObject呢?
_sampleObject的下劃線只是一種常用的命名規範,因爲當你不寫@synthesize的時候,編譯器自動爲你生成getter和setter方法中,你可以直接通過_xxx的形式來調用getter方法。你當然可以使用其他名字。
@dynamic
於是就到了今天主要要講的@dynamic關鍵詞。之前也說到了,這個關鍵詞用的不多,最常見的地方還是在CoreData的NSManagedObject中會看見。
@dynamic A相當於告訴編譯器:“參數A的getter和setter方法並不在此處,而在其他地方實現了或者生成了,當你程序運行的時候你就知道了,所以別警告我了”這樣程序在運行的時候,對應參數的getter和setter方法就會在其他地方去尋找,比如父類。
舉一個例子吧
父類
@interface father()
@property (nonatomic, strong, readwrite) NSObject *sampleObject;
...
@synthesize sampleObject = _sampleObject;
@end
子類
@interface child : father
@property (nonatomic, strong, readwrite) NSObject *sampleObject;
...
@dynamic sampleObject;
@end
這樣的話,如果你在子類中調用sampleObject,則會調用父類的getter方法。
何時用到
比如類遵守一個delegate時,delegate中的參數在父類的初始化方法中就賦值了,而子類的沒有自己的初始化方法的時候,子類中的此參數就可以設爲@dynamic,即和父類共用一個參數