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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值