OC纪-->在Category中添加属性

通常我们使用范畴(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)。

Share Comments