赞
踩
上一篇章我们探究了类与对象的底层,这一篇我们探究一下分类,扩展与关联对象
首先我们知道扩展是在编译时就被添加到类中,而分类则是在运行时才被整合到类信息中,因此我们探究一下Category
编译之后的底层结构struct category_t
我们查看一下它的源码
发现里面存在实例方法列表,类方法列表,实例属性列表与类属性列表
由此我们得出两个结论:
get
和set
的声明,但没有去实现该方法category_t
也就是说当分类中的方法与原始类中的方法重名时,会先去调用分类中实现的方法
Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”
扩展中声明的属性以及方法会在编译阶段直接整合到类中,常用于声明私有属性与方法
通过关联对象给分类添加属性
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
参数一:id object
: 给哪个对象添加属性,这里要给自己添加属性,用self。
参数二:void * == id key : key
值,根据key
获取关联对象的属性的值,在objc_getAssociatedObject
中通过次key
获得属性的值并返回。
参数三:id value :
关联的值,也就是set方法传入的值给属性去保存。
参数四:objc_AssociationPolicy policy :
策略,属性以什么形式保存。
objc_getAssociatedObject(id object, const void *key);
参数一:id object
: 获取哪个对象里面的关联的属性。
参数二:void * == id key
: 什么属性,与objc_setAssociatedObject
中的key
相对应,即通过key
值取出value
。
- (void)removeAssociatedObjects
{
// 移除关联对象
objc_removeAssociatedObjects(self);
}
分类.h
分类.m
main函数
输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。