2.结构体没有成员变量列表,所以不能声明成员变量。
方法可以运行时改变,结构体不能运行时改变,要想改变原结构体,增加一个属性,只能用关联变量的方式,而关联本质是在类的定义之外为类增加额外的存储空间,是一层映射关系
日常开发过程中我们经常碰到要给分类添加自定义属性和变量的,下面通过关联对象给分类添加属性,也是runtime的实际应用之一,非常实用。(关于runtime的使用还有很多,这里只简单记录一下利用runtime给分类添加属性)。
关联Runtime提供了下面几个接口:
void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
id objc_getAssociatedObject(id object, const void * key)
void objc_removeAssociatedObjects(id object)
id object被关联的对象
const void * key:关联的key,要求唯一
id value:关联的对象
objc_AssociationPolicy policy:内存管理策略
1.给UILabel添加一个 竖直方向的verticalText,如下图所示:
新建一个继承UILabel的Category,并添加一个成员变量
.h文件
m.文件
调用时就直接使用点语法:
_textLabel.verticalText = @"厉害了,我的国"
2.给UIButton添加一个扩大点击区域的实例方法
新建一个继承UIButton的Category,并添加一个实例方法
.h文件
.m文件
创建button并调用:
[button setTouchExpandEdgeWithTop:30 right:30 bottom:30 left:30]
点击button的上下左右各30pt,button也会有响应。
Demo链接
类扩展可以增加属性和成员变量,一般写在.m里,所以一般为私有的
而分类可以写在.h 或者 .m 里写在.m就变成了私有的方法
分类优先级比原类的优先级较高,如果重写将覆盖原类的方法
如果非要添加属性和成员变量,可以使用runtime来添加 ,必须自己实现set 和 get方法
为类添加额外的方法,
(1) 不一定要在@implementation中实现,但是找不到实现会报错
(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime) 并手动实现 set get方法
.h
.m
不实现,运行会报错
不实现,直接警告 ,必须在@implementation中实现,
类扩展像是没有命名的类别
定义的变量可以声明在.m里,私有的,也可以声明在.h里就是共有的
方法要在.m里实现
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)