关闭

内存管理的一些小问题(面试常用)

标签: 内存管理内存泄露面试
124人阅读 评论(0) 收藏 举报
分类:

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消息。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2913次
    • 积分:215
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章分类