知识点汇总(四)

runtime 为系统类新增property

动态为系统类新增属性,以普通属性的方式进行访问。

事例如下,为UIView新增viewHegiht的方法。

1. 新增一个Category,文件名为UIView+Frame.h,UIView+Frame.m.

2. 在.h文件添加属性

1
@property (nonatomic) CGFloat viewHeight;

3. 在.m文件添加get,set方法以及实现

导入库:

1
#import <objc/runtime.h>

声明静态常量:

1
static NSString const *playloadObject = @"playloadObject";

添加IMP:

1
2
3
4
5
6
7
- (CGFloat)viewHeight{
return [objc_getAssociatedObject(self, &playloadObject) floatValue];
}

- (void)setViewHeight:(CGFloat)viewHeight{
objc_setAssociatedObject(self, &playloadObject, @(viewHeight), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

set方法内调用runtime的方法objc_setAssociatedObject实现值与地址的绑定,注意四个参数,第一个为obj对象,第二个为参数的关联地址,第三个是id类型的对象,最后一个为objc_AssociationPolicy 。

get方法内调用runtime的方法objc_getAssociatedObject获取数值,注意返回值的内容是id类型,可自行转化为自己想要的类型。

4. 结束

以上过程完成了对UIView 的扩展,实现返回view的高度。可参照实现方法实现对类的属性的封装。