记录自己未曾搞懂的Objective-C问题,逐题补全。
1、谈谈多线程
iOS中有4套多线程的方案,他们分别是
- Thread
- Grand Central Dispatch
- �Cocoa operations
一 、Thread
1)显式创建线程 NSThread
2)隐式创建线程 NSObject
二、 Cocoa Operations
1) NSInvocationOperation
2) NSBlockOperation
3)NSOperationQueue
三、 Grand Central Dispatch (GCD)
异步线程 dispatch_async
同步线程 dispatch_sync
重复执行线程 dispatch_apply
操作队列 创建 dispatch_queue_create
比较多线程技术
一、Thread
- 优点:量级较轻
- 缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
二、Cocoa Operations
- 优点:不需要关心线程管理,数据同步的问题,可以把精力放在自己需要执行的操作上
三、GCD
- 优点: GCD基于C的API,非常底层,可以充分利用多核,能够轻松在多核系统上高效的运行并发代码,也是苹果推荐使用的多线程技术。
2、什么时候用GCD 什么时候用NSOperation 什么时候用NSThread
个人理解:
当你想直接操控线程对象,并且手动管理线程的生命周期时,使用NSThred
当你使用多核操作系统,并且想让代码更高效的运行,自动管理线程的生命周期,只需要告诉它执行什么任务的时候,使用GCD
当你想使用一些在GCD中不容易复制的特性,更容易地添加任务的依赖关系使用NSOperation,并且可以很方便地取消一个NSOperation的执行
3、CoreData 和 数据库的区别
CoreData是数据持久化存储的最佳方式。
数据最终的存储类型:SQlite数据库、XML、二进制、内存里,或者自定义的数据类型。
好处:能够合理管理内存,避免使用SQlite的麻烦,高效。
CoreData是一种模型层技术,帮助你建立程序状态的模型层。CoreData也是一种持久化技术,能将模型对象的状态持久化到磁盘。
但是CoreData最重要的特点是:CoreData不仅是一种加载、保护数据的框架,它还能跟内存中的数据很好的共事。
4、响应者链
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者(first responder)不处理,事件沿着响应者链向上传递,交给下一个响应者(next responder)。一般来说,第一响应者是视图对象或者其子类对象,当其被触摸后事件由他自己处理,如果它不处理,事件就会被传递给他的视图控制器处理,然后是它的父视图(super View)对象,以此类推,直到顶层视图,接下来会沿着顶层视图(top View)到窗口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,这个事件就会被丢弃。
一般情况下,在响应者链中,只要有对象处理事件,事件就停止传递,但有时候,可以在视图响应的方法中根据一些条件判断来决定是否需要继续传递事件。
5、对Runtime了解么
6、遍历构造器
遍历构造器 是一种快速创建对象的方式,它本质上是把初始化方法做了一次封装,方便外接使用。
- 一定是一个类方法
- 一定有返回值
- 返回值类型 (id, instancetype)
便利构造器:+号方法
和自定义初始化方法的区别
自定义初始化方法(init) 初始化+赋值
遍历构造器: 开辟空间+初始化+赋值
Block
block是OC中的闭包形式
block来源:C语言 已经被弃用的一个观点:goto
解决block的循环引用:用__weak
来修饰
如何修改block内的变量:__block
修饰,可以更改block捕获的外部变量。