通常我们使用范畴(Categeory)来为已有的类添加方法。其实,在Category中亦可为其添加属性,只是无法自动创建读取方法。为了克服这点困难,我们需要借助runtime手动实现getter/setter。
1.范畴的头文件添加一个属性
1 2 3 4 5 6 7
| #import <UIKit/UIKit.h> @interface UIViewController(BNRSnapshot) @property (nonatomic, strong) UIView *snapshot; @end
|
2.实现文件导入运行时头文件,用AssocidObject(关联引用)实现读取方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #import "UIViewController+BNRSnapshot.h" #import <objc/runtime.h> @implementation UIViewController(BNRSnapshot) - (UIView *)snapshot { UIView *view = objc_getAssociatedObject(self, @selector(snapshot)); if (!view) { view = [self.navigationController.view snapshotViewAfterScreenUpdates:NO]; [self setSnapshot:view]; } return view; } - (void)setSnapshot: (UIView *)snapshot { objc_setAssociatedObject(self, @selector(snapshot), snapshot, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @end
|
3.以(objc_setAssociatedObject:)为例,它的四个参数代表了为对象object添加键值为snapshot值为snapshot的关联引用,同时关联策略为OBJC_ASSOCIATION_RETAIN_NONATOMIC,这个策略的含义类似于属性的存储关键字(strong,nonatomatic)。