天天看點

iOS 擴充類添加屬性,需要實作的set方法

        項目中,需要用到外面的 SDK ,而 SDK 中的類方法屬性都隻能從頭檔案中擷取,如果需要新增其他功能就得繼承或者擴充目前的類。

繼承可以新增屬性,執行個體變量和方法等,而且可以重寫之前 SDK 架構裡的方法;而擴充類确隻能是添加新方法,不能增加變量,對于新增的屬性,也必須要實作 set 和 get 方法。這個比較麻煩,可以按照以下方法來實作:

比如新增屬性 :(非對象類型,如果是對象類型也可以類似處理,并沒有什麼不同)

@property (nonatomic) NSInteger state;

在實作檔案裡,用 @dynamic state;聲明

-(void)setState:(MAAnnotationViewState)state

{

    //基本類型,不用置空(否則若是對象,需要判斷)

    objc_setAssociatedObject(self, MAAnnotationViewStatePorpertyKey, [NSNumber numberWithInteger: state], OBJC_ASSOCIATION_ASSIGN);

}

其中 objc_setAssociatedObject 方法在頭檔案 #import <objc/runtime.h>中。

注意1,set方法很容易讓自己寫成死循環,比如

- (void)setTest:(NSString *)test//retain屬性

{

    // test需要先retain一次,放在自指派時test被釋放為nil

    [test retain];

    if (_test != nil) {

        [_test release];

    }

    //直接release無需判斷也是可以的,iOS中對nil進行release操作合法

    //[_test release];

    self.test = test;    // 此語句已經調用 set 方法,自己調用自己,會造成死循環

                         // 正确寫法應該是 _test = test;

}

注意2,注意到屬性set方法,直接self.test = nil,就可以釋放掉屬性的記憶體,跟[self.test release]效果一樣。