使用到的模式

使用到的模式

单例模式

有些情况对于某个类自始自终只需要创建一个对象就好, 如资源工具, 想加载某个mp3, Application, .etc, 这时候就需要单例模式

设计模式: 长期以来某些方法/工具/经验的总结

不管别人怎么 alloc, init, retain, copy, 都只返回一个对象
    要做到这个, 需要控制几点
        1. 只创建一个存储空间  :: 用 dispatch_once,  将allocWithZone包起来, 为了试别人 alloc 时候返回同一个存储空间, 定义 static id _instance变量来保存 alloc 一次的对象
        2. 只初始化一次资源     :: dispatch_once将初始化资源的包起来// 或者将super init]也做 once 操作, 虽然苹果官方中没有这些, 建议还是包的好,
        3. 自己开的类方法访问获取单例时也做好控制
        4. copy 方法, 建议重写的是 copyWithZone, 也是什么都不做
        5. 对于非 ARC, 还需要自己做些内存管理
            5.1 retain 方法不加1, 返回自己就好
            5.2 release 方法. 什么也不做, 不释放对象
            5.3 retainCount 方法, 返回1
            5.4 autorelease 方法, 返回自己

    这些方法的重写几乎哪里都一样, 可以做个参数宏, 以后需要单例的时候直接调用就好, 注意: init 方法中有加载资源, 不一样, 就不纳入宏了

###适配 ARC 和非 ARC 的单例模式,
    在ARC 和 MRC 中内存管理不同, 除了 ARC 中要重写的方法之外, 还有其他的,
        适配同一个宏, 可以用条件编译, 看编译环境是不是 ARC, 是的话是什么宏, 不是的话是什么宏, 判断: __has_fearues(arc_)

#KVO : key value observing

  • 谁来监听某个 key 的 value 的变化, 只要这个 key 的 value 发生变化, 就会通知 taget
  • 只要添加了监听器, 在改声明的类里 dealloc 就要移除监听器
  • 当监听到时, 会调用监听器的observeValueForKeyPath:ofObject:change:context: 我们可以拿到 变化的值, 这样就监听了某些一致在变化的属性, 来可视化
  • 监听时设置的 option 可以设置成获得最新值或者是 old 值, 会传到回调方法的 change 字典中

#bug: 监听 KVO 监听不到回调, —- 有些属性不能使用 KVO, 要设置对了属性才会回调方法

#bug: 控件设置不起作用, label 不显示字, 进度条不动 —- 设置 UI 控件的代码不是在主线程执行, 拿不到主线程的 UI 控件来设置

#bug: 速度显示不出来, —- 速度本来设置是 NSUinteger, 需要转换为 double 再进行计算, 不然证书计算最后是0