71.GCD内部怎么实现的?
①.iOS和 OSX 的核心是 XNU 内核, GCD是基于 XNU 内核实现的(是由苹果电脑发展起来的操作系统内核).②.GCD 的 API 全部在 libdispatch 库中.③.GCD 底层实现主要有 Dispatch Queue(管理 block)和 Dispatch Source(处理事件).
72.怎么保证多人开发进行内存泄露检查。使用Analuze进行代码的静态分析,为避免麻烦,多人开发尽量使用ARC.
73、非自动内存管理情况下怎么做单例模式。创建一个单例对象的静态实例,并初始化为nil。创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个类的实例。实现NScopying协议,覆盖allocWithZone:方法,确保用户在直接分配对象时,不会产生另一个对象。覆盖release、autorelease、retain、retainCount方法,确保单例的状态。
74、对于类方法(静态方法)默认是autorelease的,所有类方法都会这样吗?①、系统自带的绝大数类方法返回的对象,都是经过autorelease.
75、block在ARC中和MRC中的方法有何区别?需要注意什么?①.对于没有引用外部变量的Block,无论在ARC还是MRC下,类型都是_NSGlobalBlock_,这种类型的block可以理解为一种全局的block,不需要考虑作用域的问题。同时,对它进行Copy和Retain操作也是无效的。②.避免循环引用。根据isa指针,block一共有3种类型的block_NSConcreteGlobalBlock 全局静态_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁
76.什么情况下会发生内存泄露和内存溢出?当程序在申请内存后,无法释放已经申请的内存空间(例如一个对象或者变量在用完后没有释放,这个对象就一直占用着内存),一次内存泄露可以忽略,但如果泄露过多的话,就会造成内存溢出。当程序在申请内存时,但存入了更大的数据,出现内存溢出。
77.[NSArray arrayWithobject]这个方法添加对象后,需要对这个数组进行释放操作吗?
不需要,这个对象会被放到自动释放池中。
78.自动释放池如何实现?
自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将被添加到栈顶,当一个对象收到发送autorelease消息时,它将添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除并且会给池子里所有对象都做一次release操作。
79.KVO内部实现原理?
①.KVO是基于runtime机制实现的。
②.当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。
派生类在被重写setter方法中实现了真正的通知机制。(Person->NSKVONotification Person)
80.能否把比较耗时的操作放在NSNotificationCenter中。
如果在异步线程发出的通知,那么就可以把耗时操作放到NSNotificationCenter中
如果在主线程发的通知,那么就不可以把耗时操作放到NSNotificationCenter中。