category(分类)
- 作用:不用直接更改「父」类(也不用继承)的情况下添加方法(比如没有源码时); 另外在apple sdk中很多.h文件中(比如NSRegularExpression.h)有分类的影子, 它们将不同类型的方法做了一个分类, 可读性大提高,很不错. 还有网友说category可用于多人合作开发一个大型的类,个人觉得它的出现可能有考虑到合作开发,但更适合给没有源码的类添加辅助性小功能的情况下使用,而不适合一起合作开发一个类。因为一个类的设计会考虑属性、实例变量等类元素,而category不能直接创建它们。
- 优点:没有类源码也能添加方法。
- 局限:1.不能创建实例变量(自然属性也无法创建);2.名称冲突,名称冲突时category的优先级更高,会替代原有类的方法,可添加一个前缀来避免冲突。
- 注意:非要走不寻常的路、给category添加属性与实例变量,该怎么办?可通过runtime.h 中 objc_getAssociatedObject / objc_setAssociatedObject 来访问和生成关联对象。通过这种方法来模拟生成属性。用处不大,有兴趣的盆友自己google/baidu。
- 创建:和创建类类似New File >>> Objective-C category.
extension(扩展)
- 作用:集中管理类私有的实例变量和方法,如果一个属性对外是只读对内可读写,也可以用extension实现。因为@interface 行的语法书写和 category 有点像,所以有人说extension是个匿名的category,但它们完全不是一会事。应用场景和实现过程完全不同。
- 创建: 通过New File >>> Objective-C extension来创建,会发现只有一个.h文件,因为实现都写在.m文件里了。其实创建UIViewController时,.m文件里的@interface …@end就是一个extension。
- 注意:方法私有化除用extension外,还可以直接在.m文件时写实现,不过这样会损失可读性,特别是方法名叫多的时候。
category和extension的区别
- 都是OC中对类进行扩展的技术;
- category:适合给没有源码的类添加方法,不能创建实例变量(自然属性也不可以);
- extension:适合集中管理类的私有方法,可创建私有的属性和实例变量。
OC的category和extension
最新推荐文章于 2017-04-19 14:36:00 发布