3.OC语言特性相关

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方法返回的都是不可变对象

你可能感兴趣的:(3.OC语言特性相关)