杨小麦OC之旅--Category添加属性


5th,Dec,2015
update on 5th,April,2016; 9th,May,2016 ;
11st,March,2017 -- 添加Category的原理部分与Category VS Extension。
Category:无需继承  动态 为已有的类添加方法。

注意事项:
1) Category的头文件中的方法不一定非要在@implementation中实现,也可在其他位置实现,但如果调用时依据继承树找不到该方法的实现会导致程序崩溃;
2) 理论上且苹果也不建议给Category添加成员变量;

优缺点

优点:
1.类中方法很多的情况下可依据方法功能相关性等拆分在多个文件中实现,有益于代码组织与团队多成员协同开发;
2.类以库的形式存在 无源代码的情况下修复Bug;
缺点:
1.不能声明属性,但可使用@dynamic变相实现;
2. 类别中的方法优先级最高,覆盖父类的方法,可能会导致super中的消息断裂。=> 因而,最好不要覆盖

分类文件名一般是“原有类名+分类名称”

实现原理

对象模型的存储在内存中是一个结构体,结构体的大小不能动态变化,因而无法在运行时动态地给对象添加成员变量。而方法的定义保存在类的可变区域中,通过修改执行方法的指针的指针的值,可以动态的添加成员方法。

类的声明

#import "SystemClass.h"

@interface SystemClass(CategoryName)
// Method declaration
@end

// 实现

@implementation SystemClass(CategoryName)

  
@end



Category添加属性

通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象 来模拟生成属性。
杨小麦OC之旅--Category添加属性_第1张图片

杨小麦OC之旅--Category添加属性_第2张图片

Category VS Extension:

刚接触的时候总会接触到Extension是匿名的Category的观念,因而就默默的将Extension当成特殊的Category。但其实两者完全是两个东西。Extension是在编译阶段与头文件和实现文件共同构成一个类,声明周期跟类一样。通常是用来隐藏类的私有信息。且无法为系统类添加Extension。

而Category则是在运行时动态的已有类添加方法,


参考资料

    Category-iOS Developer Library

       iOS设计模式——Category

  让Category支持添加属性与成员变量

       iOS类别(Category)与扩展(Extension)

      深入理解Objective-C:Category





你可能感兴趣的:(iOS录)