项目中,需要用到外面的 SDK ,而 SDK 中的类方法属性都只能从头文件中获取,如果需要新增其他功能就得继承或者扩展当前的类。
继承可以新增属性,实例变量和方法等,而且可以重写之前 SDK 框架里的方法;而扩展类确只能是添加新方法,不能增加变量,对于新增的属性,也必须要实现 set 和 get 方法。这个比较麻烦,可以按照以下方法来实现:
比如新增属性 :(非对象类型,如果是对象类型也可以类似处理,并没有什么不同)
@property (nonatomic) NSInteger 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]效果一样。