拾遗 - OC语言特性

动态性(Dynamic)

  • - 动态类型
    • 指的是对象指针类型的动态性、具体是指使用id任意类型将对象的类型确定推迟到运行时
    • 动态类型识别 isKindOfClass
  • - 动态绑定
    • 核心是在运行时动态的为类添加属性和方法
    • 消息传递机制
  • - 动态加载
    • 动态资源加载
    • 可执行代码模块的加载

成员变量和属性

属性:成员变量+setter+getter

Category(类别/分类/类目)

应用场景

  • 多人维护同一个类
  • 为已经存在的类添加方法
  • 声明私有方法
  • 模拟多继承
  • 把frameowork的私有方法公开

注意

  • 分类只能添加方法 不能增加成员变量
  • 分类同名的方法会覆盖原来的方法(原来的方法还有只是在顺序列表的后面)
  • 分类方法中不可以调用super
  • 相同方法的优先级 分类(最后编译的分类优先)-> 原类 -> 父类
  • 分类是runtime时加载 不是编译时
  • 分类可通过runtime 关联对象 添加属性(类别中添加@property描述的属性,(只会生成这个属性的set,get方法的声明,也就不是会实现.)这时候编译是没问题的没警告没报错,但是一旦在创建对象后为属性赋值或者使用这个属性的时候,程序就崩溃了,奔溃的原因也很简单,就是找不到属性的set/get方法)

Extension(扩展)

  • 为一个类添加额外的原来没有变量,方法和属性
  • 一般的类扩展写到.m文件中
  • 一般的私有属性写到.m文件中的类扩展中

Category 和 Extension 区别

  • Class Extension 在编译期就会将定义的 Ivar、属性、方法等直接合入主类,而 Category 在程序启动 Runtime Loading 时才会将属性(没 Ivar)和方法合入主类
  • Class Extension 是匿名的 Category
  • 主要的区别在于,对于扩展,编译器将期望您在主@implementation中实现方法,而对于类别,您有一个单独的@implementation块

Delegate

使用weak 防止循环引用

NSNotification

观察者模式

KVO(Key-value observing)

观察者模式

实现原理

Apple 使用了 isa 混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A 的派生类,并将被观察对象的isa 指向这个派生类,该类继承自对象A的本类,且 KVO 为 NSKVONotifying_A 重写观察属性的 setter 方法,setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。
(备注: isa 混写(isa-swizzling)isa:is a kind of ; swizzling:混合,搅合;)

注意

必须继承NSObject 因为NSObject可监听值的变化 NSKeyValueObserving

KVC(Key-value Coding)

  • 动态set、get
  • 访问私有属性
  • KVC和Objc的runtime组合可以很容易的实现Model和字典的转换
  • KVO是基于KVC实现的