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的优先级最高 会覆盖掉原来类中的方法