Category(分类)
- 声明私有方法
- 分解体积庞大的类文件
- 把Framework的私有方法公开
特点
- 运行时决议
- 可以为系统类添加分类
可添加那些内容
- 实例方法
- 类方法
- 协议
- 属性(只生成setter和getter的声明,不会生成setter和getter的实现以及成员变量)
- 可通过关联对象添加成员变量
struct objc_category {
char * _Nonnull category_name OBJC2_UNAVAILABLE; //分类名
char * _Nonnull class_name OBJC2_UNAVAILABLE; //类名
struct objc_method_list * _Nullable instance_methods OBJC2_UNAVAILABLE; //实例方法
struct objc_method_list * _Nullable class_methods OBJC2_UNAVAILABLE; //类名
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE; //协议
}
关联对象
//关联对象 object:被关联的对象; key:关联的key,要求唯一; value:关联的对象
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)
Extension(扩展)
一般用扩展做什么
- 声明私有属性
- 声明私有方法
- 声明私有成员变量
特点
- 编译时决议
- 只以声明的形式存在,多数情况下寄生于宿主类的.m中
- 不能为系统类添加扩展
通知
- 是使用观察者模式来实现的用于跨层传递消息的机制
- 传递方式为一对多
代理
- 一对一
KVO
- KVO是OC对观察者设计模式的又一实现
- Apple使用了isa混写(isa-swizzling)来实现KVO
- 使用setter方法改变值kvo才会生效
- 使用setValue:forKey:改变值kvo会生效
- 成员变量直接修改需手动添加kvo(willChangeValueForKey 和 didChangeValueForKey)才会生效
属性关键字
- 读写权限
readonly
readwrite - 原子性
atomic:线程安全
nonatomic - 引用计数
return/strong
assign/unsafe_unretained
assign和week有什么区别
- assign
修饰基本数据类型,如int,bool等
修饰对象类型,不改变引用计数
会产出悬垂指针。 - weak
不改变被修饰对象的引用计数
所指对象在被释放之后会自动置为nil
copy
- 可变对象的copy和mutableCopy都是深拷贝
- 不可变对象的copy是浅拷贝 mutableCopy都是深拷贝
- copy方法返回的都是不可变对象
网友评论