这里集成了以上所有的小例子,帮助理解,先上demo:GitHub - paradisery/iOS-KVO-GCD-Block-Delegate-shareInstance-NSUserDefaults-Demo: KVO-GCD-Block-Delegate-单例-NSUserDefaults传值 详解
KVO:
在MVC设计架构下的项目,KVO机制很适合实现mode模型和view视图之间的通讯。
代码中,在模型类A创建属性数据,在控制器中创建观察者,一旦属性数据发生改变就收到观察者收到通知,通过KVO再在控制器使用回调方法处理实现视图B的更新;
KVO 的实现依赖于 Objective-C 强大的 Runtime,key-value observing:监听某个对象的某个属性发生变化,当发生变化,观察者会调用相应函数,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制。
GCD和NSOpertaionQueue:
关系:①:先搞清两者的关系,NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象!
②:GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整。GCD不支持异步操作之间的依赖关系设置。如果某个操作的依赖另一个操作的数据(生产者-消费者模型是其中之一),使用NSOperationQueue能够按照正确的顺序执行操作。GCD则没有内建的依赖关系支持。
③:NSOperationQueue支持KVO,意味着我们可以观察任务的执行状态。
了解以上不同,我们可以从以下角度来回答
性能:①:GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是速度最快的。这取决于使用Instruments进行代码性能分析,如有必要的话
②:从异步操作之间的事务性,顺序行,依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持
③:如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD则更有优势
“在大概97%的时间里,我们应该忘记微小的性能提升。过早优化是万恶之源。”只有Instruments显示有真正的性能提升时才有必要用低级的GCD。
Block:
block的核心思想:比如我打你一巴掌(发送消息),然后你说你打到我了(响应消息),那我心里就爽了(回调block).
block的内存空间是另外开辟的,所以不会立马执行block内的代码,block就是代码块,什么时候调用,什么时候才响应。
注意: __weak typeof(self) weakSelf =self;防止循环引用。
Delegate:
代理就是雇佣A方和被雇佣B方定一个协议:“类名+Delegate”,然后有协议方法:”代理传值方法“,让B用协议方法传个值,A方实现代理方法,拿到值。这个代理就完成了。
单例:
简单的说,单例是一个特殊的实例,在单例所属的类中只存在单例这么一个实例,并且单例类似全局变量,在系统任意地方都能访问单例,就是两种写法:
NSUserDefaults:
NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了,这个就是把值存在全局本地,在任意地方都可以调用,注意的就是键值,和增删。
后续还会往更新,都是根据自己的理解编写,有不对的地方欢迎指正。