oc的类别
类别
1.类别的作用
针对于第二点的理解:
也就是可以在分类的h文件中对主类的私有方法进行暴露,并且不需要任何的实现
2.类别的特点
- 类别不能添加实例变量,也就是因为这样,所以无法为属性生成对应的set和get方法,是dynamic的。
解决方式:通过对象的关联机制,也就是利用objc_setassocited(关联者,关联的key,关联的值,关联的策略)
利用objc_getassocited进行获取对应的值,如下
利用了mykey和传入的height进行了关联,对其的值进行存储以及取出。
原理:hashmap的原理,简而言之:关联对象存储在“全局”的haspmap中,利用键值对的原理进行读写。
对关联对象设置为nil就是移除了关联对象(调用了erase方法),比如在外部对per.height = nil就是移除了关联对象
关联对象的键值一般是@selector(方法名)最好
- 类别可以继承主类的实例变量
类别的方法和主类方法优先级
分类的结构:类名,方法类别,属性列表,协议列表(注意没有ivar实例变量列表)
由于方法存在一个方法列表。在运行的过程中,方法会动态合并到主类(runtime),合并的方式是类似头插法,根据编译的顺序前后,对方法进行插入,最晚编译的优先级最高/
为什么需要类别
类扩展
无名的分类,可以添加实例变量,可以添加属性,也会有对应的set和get方法
与类别的区别
分类是运行时将方法属性等合并进入主的类对象中,但是类扩展是在编译的时候就已经存在于类对象中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!