ios category 和 extension 的区别以及如何为 category 添加属性

如果你面试过几次, 尤其是有笔试题的那种公司, 这个问题的出现几率很高, 其实出笔试题也不容易, 太难了他们自己也不会, 太容易又显示不出水平, 就这种既能考点基本功 又能无意中看你是否了解 runtime.

首先我觉得其实 category 和 extension 都可以归为一类, 分类, extension 可以看做匿名分类

1 >>> category 分类

什么是分类呢? 就是在不用继承,不改变原来类的情况下, 为一个类添加新的方法, 扩展类的功能, 比如你可以给 NSString 类添加一个自动大小写转换的方法, 以后你只要直接用 NSString 对象直接调用该方法就好了

(1)创建分类 new file -> objc-file -> 选择类型 category ,选择 class -> create

(2)使用 分类的样子 NSString + stringCate.h 形如这种 , 可以在. h中声明方法 ,.m 实现该方法即可, 其他跟调用方法一样

(3)如何添加属性, 大家都知道 category 和 extension 的区别是 category 不能添加属性,而 extension 可以, extension 中的属性和方法会被当做私有的, 但是我们可以利用runtime 这种神器为 category 添加属性,其中会用到一个关联属性的 API

static NSString *strKey = @"strKey";

objc_setAssociatedObject(self, &strKey, cateStr, OBJC_ASSOCIATION_COPY);

objc_getAssociatedObject(self, &strKey);

#import "NSString+stringCate.h"

static NSString *strKey = @"strKey";

@implementation NSString (stringCate)

// setter

-(void)setCateStr:(NSString *)cateStr{

objc_setAssociatedObject(self, &strKey, cateStr, OBJC_ASSOCIATION_COPY);

}

// getter

-(NSString *)cateStr{

return objc_getAssociatedObject(self, &strKey);

}

-(void)printString{

NSLog(@"this is a category method");

}

@end

代码已经很清晰了, 声明属性 , 重写 setter getter 方法,在 setter 里设置关联属性 , 在 getter 里获取关联属性

2>>> extension

extension 就不用说了吧 其实上面已经讲到了 extension是一个声明私有方法和私有的变量的好地方

与 category 不同的是 extension 中声明的方法一定要实现 , category 则没有这种限制

category的优先级最高 会覆盖掉原来类中的方法

相关推荐