1.多人开发如何检查内存泄漏?
> 使用Analyze进行代码的静态分析;
> 尽量在ARC环境下进行多人开发。
2.MRC环境下怎么做单例模式?
基本步骤:
>声明一个单例对象的静态实例并初始化为nil;
>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例;
>实现NSCopying协议,覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时不会产生另一个对象;
>覆盖release、autorelease、retain、retainCount方法,以此确保单例的状态;
>在多线程环境中,注意使用@synchronized关键字或者GCD,确保单例的状态。
ARC环境下:
比MRC少了几个步骤:
>声明实例化对象,初始化为nil;
>重写allocWithZone方法;
>实现NSCopying协议,覆盖allocWithZone:方法;
3.block在ARC和MRC中的用法有什么区别?需要注意什么?
(使用block不能用self. ,也会持有对象,造成循环引用)
>在使用block前需要对block做判空处理(不判空直接使用,一旦指针为空直接崩溃);
>在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。
【将block赋值为空,是解掉循环引用的重要方法。(不能只在dealloc里面做赋空值操作,这样已经产生的循环引用不会被破坏掉)】
>使用方将self或成员变量加入block之前要先将self变为__weak
>在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。
ARC环境下:
>使用__block修饰变量,
MRC环境下:
>使用__weak修饰变量,
>block如果作为成员参数,要将block从栈上拷贝到堆上。
4.什么情况下会发生内存泄漏和内存溢出?
使用完成后没有释放,对象一直占有内存。
内存泄漏堆积起来,无论多少内存迟早会被占光,最终会导致内存溢出。
5.自动释放池的底层实现
自动释放池以栈的形式实现:当一个新的释放池被创建时,会被添加到栈顶。当一个对象收到autoRelease消息时,他被添加到当前线程处于栈顶的自动释放池,当释放池呗回收时,它们从栈顶被删除,并且会给池子里所有对象发送一条release消息。