1.分类
分类的作用:
- 可以为原类添加方法(也可以通过runtime的objc_setAssociatedObject和objc_getAssociatedObject方法作为属性的setter/getter方法来添加属性)
- 重新创建一个文件来续写原类的内容,避免原类文件因为多功能造成代码量较大而显得比较臃肿。
- 重写原类中的方法时,原类方法被覆盖,以分类方法为主。但是重写的时候系统会提示。
- 多人开发的时候可以利用多文件改写一个类的方法来共同开发,互不影响。
- 可以为原来添加私有的方法(或属性)。
分类的缺点:
- 分类重写原类方法之后,优先级大于原类。原类方法被覆盖后,只能通过IMP指针进行原类的方法调用。
- 可多处重写原类的同一个方法,并且由于它是运行时添加,所以会以最后一个运行的方法为准,不可控。
- 只能通过runtime的方式添加属性变量。
- 写在.h的是共有,.m的是私有。
2.扩展
扩展的作用:
- 为原类添加属性和方法。
- 功能分解,同一个类的不同功能可以通过分类的方式进行分开写,不同功能模块放到不同的扩展里面,条理清晰。
- .m文件的@interface就是扩展的使用,为原类添加私有属性和方法。
- .h的@interface是公有。
扩展的缺点:
- 扩展的方法只能依赖原类去实现。
- 不能为系统类添加扩展。
3.分类的结构体成员变量
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct protocol_list_t *protocols;
struct property_list_t *instanceProperties;
// Fields below this point are not always present on disk.
struct property_list_t *_classProperties;
method_list_t *methodsForMeta(bool isMeta) {
if (isMeta) return classMethods;
else return instanceMethods;
}
property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
protocol_list_t *protocolsForMeta(bool isMeta) {
if (isMeta) return nullptr;
else return protocols;
}
};
iOS的源码中
objc4-779.1
直接搜索struct category_t
可以找到。
网友评论