iOS开发分类Category和扩展Extension

释放双眼,带上耳机,听听看~!

平时用分类做什么?

  • 声明私有方法
  • 分解体积庞大的类文件
  • 把framework 的私有方法公开化

分类的特点

  • 运行时决议
  • 可以为系统类添加方法

分类中可以添加哪些内容

  • 实例方法
  • 类方法
  • 协议
  • 属性(只是声明get set 方法,并非添加变量)
分类的加载调用栈

方法调用顺序:_objc_init -> map_2_images(镜像) -> map_images_nolock -> read_images(读取镜像) -> remethodizeClass

注意

  • 分类添加的方法可以“覆盖”原类的方法
  • 同名分类方法谁能生效取决于编译顺序(最后被编译的分类,会被优先被生效)
  • 名字相同的分类会引起编译报错

能否为分类添加成员变量

可以。用关联对象的技术可以为分类添加成员变量

//根据“key”获取相应的值
id objc_getAssociatedObject(id object,const void * key)
//把值value 通过key 和相应的策略 policy(assign,weak等等)赋值给object
void objc_setAssociateObject(id object,const void * key,id value, objc_AssociationPolicy policy )
//根据传过来的对象移除所有与之相关联的对象
void objc_RemoveAssociateObjects(id object)

另注:关联对象的本质
关联对象由AssociationsManager管理并在AssociationsMapHash中储存。所有对象的关联内容都在同一个全局容器

关联对象的本质

扩展

什么时候用到扩展

  • 声明私有属性
  • 声明私有方法
  • 声明私有成员变量

扩展特点

  • 编译时决议
  • 只能以声明的形式存在,实现 多数情况下寄生于宿主类的.m文件中
  • 不能为系统类添加扩展

 

为TA充电
共{{data.count}}人
人已赞赏
iOS文章

iOS开发中引用计数相关问题

2021-2-4 10:39:54

iOS文章

iOS开发关于UICollectionViewCell高度自适应的问题

2021-2-4 11:54:52

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索