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方法

与类别的区别

分类是运行时将方法属性等合并进入主的类对象中,但是类扩展是在编译的时候就已经存在于类对象中。

posted @   OYNanaHlb  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示