1.weak与assign的区别?
在MRC环境下 使用retain 修饰对象类型,使用assin实现基本数据类型。
在ARC环境下,strong相当于retain,weak相当于assign,但是weak只能修饰对象类型,而assign使用修饰基本数据类型。weak是一种弱引用。
assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针!
2.strong与copy的区别?
在定义一个类property的时候,为property选择strong还是copy的时候需要特别注意,如果property是NSArray或是NSString及其子类的时候,最好选择copy属性修饰,为什么呢?这时为了防止赋值给它的可变数据,如果可变的数据发生了变化,那么该property也会发生变化。
(1) strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
(2) copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property
3.多线程GCD的简述
GCD是iOS4.0推出的,主要针对多核cpu做了优化,是c语言的技术
GCD是将任务(block)添加到队列(串行/并行/全局/主队列)并且以同步/异步的方式执行任务的函数,任务的取出遵循队列FIFO原则:先进先出,后进后出
GCD提供了一些NSOperation不具备的功能
一次性执行:可以保证某一段代码在程序运行的过程中只被执行一次,一次性执行是线程安全的,在多线程环境下也是只执行一次,应用场景:设计单例模式
延迟执行:即实现等待多长时间后在哪个队列中执行什么代码块
调度组:监听一组异步任务执行结束之后,我们能够得到统一的通知,注意:在其调度组内的任务执行完毕后执行后面的“刷新主界面”与“玩完”之间的执行没有先后顺序
(2)NSOperation
NSOperation是iOS2.0推出的,iOS4.0之后重写了NSOperation
NSOperation将操作(异步任务)添加到队列(并发队列)就会执行制定操作的方法
NSOperation里提供的方便操作
最大并发数
队列的暂停/继续
取消队列中所有的操作
指定操作之间的依赖关系(GCD可以用同步实现,但是比较麻烦)
同步和异步决定了要不要开启新的线程(同步不开,异步开)
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新线程中执行任务,具备开启新线程的能力
串行和并发决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
当任务是异步的时候,队列决定了开启多少条线程
串行队列:只开启一条
并发队列:可以开启多条
主队列特点:主队列中的任务,只有主线程在空闲的时候才会调度任务执行
主队列又叫全局串行队列,程序启动的时候就创建了主队列,在使用的不需要创建,直接GET。主队列中的任务是要在主线程执行的。
主队列,异步任务
不开线程,同步执行
主队列,同步执行
程序执行不出来(死锁)
死锁的原因,当程序执行到下面这段代码的时候
主队列:如果主线程正在执行代码,就不调度任务
同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务,此时互相等待,程序无法往下执行(死锁)
主队列和串行队列的区别
串行队列:必须等待一个任务执行完成,再调度另一个任务
主队列:以先进先出调度任务,如果主线程上有代码执行,主队列不会调度任务
主队列,同步执行 ->放入异步执行解决死锁
全局队列本质就是并发队列
全局队列和并发队列的区别
并发队列有名称,可以跟踪错误,全局队列没有
全局队列在ARC中不需要考虑释放内存,
并发队列在MRC中需要手动释放内存,因为并发队列是creat创建出来的 在MRC见到creat就要release,全局队列不需要release
一般我们使用全局队列,因为使用起来更加简单
《3.》综合比较其各自使用范围如下
性能1.GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是数度最快的。着取决于使用instruments进行代码性能分析,如果有必要的话
2,从异步操作之间的事务性,顺序性,依赖关系。GCD需要自己写更多的代码来实现,而NSOperaitonQueue已经内建了这些支持
3.如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD 则更有优势!