項目中,需要用到外面的 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]效果一樣。