iOS中,@dynamic關鍵字和@synthesize關鍵字是用來做什麼的?

  • @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,即和父類共用一個參數

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