美文网首页
OC属性关键词的用法之间的区别

OC属性关键词的用法之间的区别

作者: ldxgxy | 来源:发表于2016-06-16 10:33 被阅读38次

    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 则更有优势!

    相关文章

      网友评论

          本文标题:OC属性关键词的用法之间的区别

          本文链接:https://www.haomeiwen.com/subject/ztsorttx.html