黑马程序员技术交流社区
标题: iOS面试之内存管理篇 [打印本页]
作者: 柳柳桑 时间: 2016-3-7 14:23
标题: iOS面试之内存管理篇
iOS面试之内存管理篇
内存管理(★★★)
一、怎么保证多人开发进行内存泄露的检查。
• 使用Analyze进行代码的静态分析
• 为避免不必要的麻烦, 多人开发时尽量使用ARC
二、非自动内存管理情况下怎么做单例模式。
创建单例设计模式的基本步骤:
>声明一个单件对象的静态实例,并初始化为nil;
>创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例;
>实现NScopying协议, 覆盖allocWithZone:方法,确保用户在直接分配和初始化对象时,不会产 生另一个对象;
>覆盖release、autorelease、retain、retainCount方法, 以此确保单例的状态;
>在多线程的环境中,注意使用@synchronized关键字或GCD,确保静态实例被正确的创建和初始化。
三、对于类方法(静态方法)默认是autorelease的。所有类方法都会这样吗?
1> 系统自带的绝大数类方法返回的对象,都是经过autorelease的。
四、block在ARC中和MRC中的用法有什么区别,需要注意什么?
1.对于没有引用外部变量的Block,无论在ARC还是非ARC下,类型都是__NSGlobalBlock__,这种类型的block可以理解成一种全局的block,不需要考虑作用域问题。同时,对他进行Copy或者Retain操作也是无效的;
2.应注意避免循环引用。
五、什么情况下会发生内存泄漏和内存溢出?
当程序在申请内存后,无法释放已申请的内存空间(例如一个对象或者变量使用完成后没有释放,这个对象一直占用着内存),一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。内存泄露会最终会导致内存溢出!
当程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个int,但给它存了long才能存下的数,那就是内存溢出。
六、[NSArrayarrayWithobject:] 这个方法添加对象后,需要对这个数组做释放操作吗?
不需要 这个对象被放到自动释放池中。
七、Json数据的解析?
• JSON解析的方案
1、SBJson
;
2、JSONkit
;
3、NSJSONSerialization
。
八、自动释放池底层怎么实现?
自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到栈顶。当一个对象收到发送autorelease消息时,它被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除, 并且会给池子里面所有的对象都会做一次release操作。
九、自动释放池是什么,如何工作?
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁。
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的。
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一。
十、Objective-C如何对内存管理的,说说你的看法和解决方法?
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
1、(Garbage Collection)自动内存计数:这种方式和java类似,在你的程序的执行过程中。始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。所以“Garbage Collection”不是本入门指南的范围,对“GarbageCollection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话 “GarbageCollection”不大适合适初学者研究。
解决:通过alloc– initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1,那么在程序中做相应次数的release就好了。
2、(Reference Counted)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。当系统(也就是 Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。顺便提一句,如果没有 Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。
解决:一般是由类的静态方法创建的, 函数名中不会出现alloc或init字样, 如[NSStringstring]和[NSArray arrayWithObject:], 创建后引用计数+0,在函数出栈后释放, 即相当于一个栈上的局部变量. 当然也可以通过retain延长对象的生存期。
3、(NSAutoRealeasePool)内存池:可以通过创建和释放内存池控制内存申请和回收的时机。
解决:是由autorelease加入系统内存池,内存池是可以嵌套的, 每个内存池都需要有一个创建释放对, 就像main函数中写的一样. 使用也很简单,比如[[[NSString alloc]initialWithFormat”Hey you!”] autorelease], 即将一个NSString对象加入到最内层的系统内存池, 当我们释放这个内存池时, 其中的对象都会被释放。
十一、需要在手动管理内存分配和释放的Xcode项目中引入和编译用ARC风格编写的文件,需要在文件的CompilerFlags上添加参数。
作者: 安先森 时间: 2016-3-7 22:26
赞一个!!!
作者: 王尉安 时间: 2016-3-7 23:32
貌似得了二楼0.0
作者: 旅人 时间: 2016-3-8 00:15
顶,挺给力的
作者: 柳柳先生 时间: 2016-3-8 07:45
你会写代码?
作者: heimazj 时间: 2016-3-8 08:34
谢谢楼主
作者: 从心开始のBean 时间: 2016-3-8 08:50
我用来学习学习
作者: 信念的旗帜 时间: 2016-3-8 19:53
今天刚学到这里,来看看
作者: 王尉安 时间: 2016-3-8 20:12
666666666666666666666666
作者: 897923460 时间: 2016-3-8 23:44
路过拿黑马币
作者: Eric_Jia 时间: 2016-3-9 18:00
签到!!!!!
作者: TJL 时间: 2016-3-9 18:23
新人签到
作者: lichuanlong 时间: 2016-3-9 20:45
每日一签 
作者: 吴振伟 时间: 2016-3-9 20:51
6666666666666666
作者: pojian 时间: 2016-3-9 20:58
对于我这个IOS新手而言,这些信息超前,还是踏实学好OC.
作者: 阳光多灿烂 时间: 2016-3-9 21:25
我只是看看不说话
作者: 黑客吴二少 时间: 2016-3-9 21:27
每天都是收获
作者: 咘噜不撸Blue 时间: 2016-3-9 21:29
醉了,我还在学习C语言呢,差距太大.
作者: 妖精的旋律 时间: 2016-3-9 21:31
好!!!!!!!!!!!
作者: 夏天6 时间: 2016-3-9 21:34
66666666,我们刚学完不久,老师讲的很透彻
作者: 从心开始のBean 时间: 2016-3-9 21:39
还没学到这里啊....
作者: 3131137826 时间: 2016-3-9 22:25
顶顶顶顶顶顶顶顶顶
作者: 王尉安 时间: 2016-3-9 22:31
66666666666666666666666666
作者: jacku 时间: 2016-3-9 23:23
今天好冷啊
作者: 彼岸花开 时间: 2016-3-9 23:35
整理得很好,谢谢分享.
作者: wangpeng1 时间: 2016-3-9 23:58
wanan!!!!!!!
作者: h847941727 时间: 2016-3-10 00:04
加油加油加油加油
作者: 彼岸花开 时间: 2016-3-10 00:07
整理得很好,谢谢分享.
作者: clinging 时间: 2016-3-10 09:45
很好!!!!!!!!
作者: pojian 时间: 2016-3-10 10:05
加油,加油!
作者: dx206 时间: 2016-3-10 12:13
顶一个,学习
作者: agaoyin 时间: 2016-3-10 12:41
努力学习
作者: wangpeng1 时间: 2016-3-10 12:45
努力学习!
作者: wangpeng1 时间: 2016-3-10 12:48
赞!!!!!!!!!!!!!!
作者: Eric_Jia 时间: 2016-3-10 17:48
努力学习!!!!
作者: chenglei2016 时间: 2016-3-10 17:54
学习一下
作者: 王闯 时间: 2016-3-10 18:04
学习一下啦
作者: 夏天6 时间: 2016-3-10 18:14
好棒,学习了
作者: TJL 时间: 2016-3-10 18:46
新人路过,赞一个~!
作者: raink001 时间: 2016-3-10 19:14
新人路过,赞一个~!
作者: 3131137826 时间: 2016-3-10 19:22
顶顶顶顶顶顶顶顶顶
作者: 叫我超哥 时间: 2016-3-10 20:24
赞 赞 赞
作者: 鱼的七秒钟记忆 时间: 2016-3-10 21:10
签到啦!!!
作者: hezhaohui55 时间: 2016-3-10 22:54
努力努力努力
作者: 冷傲阳 时间: 2016-3-10 23:13
签到!!!!!
作者: 刘炎炎 时间: 2016-3-10 23:32
码住,希望用上
作者: 艾斯空气 时间: 2016-3-10 23:55
签到咯。
作者: agaoyin 时间: 2016-3-11 09:32
签个到!
作者: agaoyin 时间: 2016-3-11 10:27
赞一个!!!
作者: raink001 时间: 2016-3-11 10:58
加油加油!
作者: feng2706 时间: 2016-3-11 11:05
赞一个 写的真不错
作者: raink001 时间: 2016-3-11 11:13
加油加油!
作者: 咘噜不撸Blue 时间: 2016-3-11 13:57
还没有学习那么多,赞一个..顶起..
作者: 王尉安 时间: 2016-3-11 17:18
6666666666666666666666
作者: zpj19921115 时间: 2016-3-11 19:53
学的还不是很多
作者: 冷傲阳 时间: 2016-3-11 20:49
顶顶顶顶
!!!!!
作者: 3131137826 时间: 2016-3-11 21:14
顶顶顶顶顶
作者: itheimaly 时间: 2016-3-11 21:38
作为基础班都还没学完的我表示......看不懂
不过我相信上了就业办以后会有质的提升
作者: 非良人 时间: 2016-3-11 21:50
赞一个!
作者: 蚂蝗 时间: 2016-3-11 22:14
楼主好人,一生平安!!!
作者: 蚂蝗 时间: 2016-3-11 22:15
楼主好人,一生平安!!!
作者: 老地方 时间: 2016-3-11 22:26
说得太好了
作者: Demo丶 时间: 2016-3-11 22:48
感谢!!!!!
作者: 黑客吴二少 时间: 2016-3-11 23:31
说得很好
作者: 张演虎 时间: 2016-3-12 01:04
我就看看,我不说话
作者: 王闯 时间: 2016-3-12 01:29
说的太好了
作者: chuanzhang 时间: 2016-3-12 01:38
马克 占座 留着以后用
作者: Y丶Seven 时间: 2016-3-12 02:09
签到!!!!!!
作者: agaoyin 时间: 2016-3-12 09:10
签到!!
作者: agaoyin 时间: 2016-3-12 09:17
赞一个!
作者: fabiocn 时间: 2016-3-12 11:06
还没学先收藏下~
作者: tanyong 时间: 2016-3-12 11:14
赞一个!
作者: pojian 时间: 2016-3-12 12:28
咱们来学习编程
作者: 叫我超哥 时间: 2016-3-12 13:26
签到!!!
作者: yolande 时间: 2016-3-12 14:22
加油!厉害的漂
作者: 蒂尔 时间: 2016-3-12 14:45
学习来的
作者: LimbSun 时间: 2016-3-12 16:22
学习 签到!!!
作者: LimbSun 时间: 2016-3-12 16:26
学习学习学习
作者: 无色无味 时间: 2016-3-12 16:28
ios学习签到
作者: 337325635 时间: 2016-3-12 19:50
又学到了啦
作者: wangpeng1 时间: 2016-3-12 21:04
!!!!!!!!!!!!!!!!!
作者: dandan225110 时间: 2016-3-12 22:07
犀利!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: cc1991 时间: 2016-3-12 22:10
感觉苹果的使用人真的好多!!但是为啥Android的市场占有率怎么那么高啊
作者: jacku 时间: 2016-3-12 22:18
签到来了。
作者: heimazj 时间: 2016-3-12 23:02
我来转一圈!!!
作者: 刘炎炎 时间: 2016-3-12 23:07
加油加油
作者: 无色无味 时间: 2016-3-13 00:11
新的一天来到了
作者: jacku 时间: 2016-3-13 00:11
我来转一圈!!!
作者: raink001 时间: 2016-3-13 00:17
begining,now!
作者: agaoyin 时间: 2016-3-13 10:17
签到!!
作者: pojian 时间: 2016-3-13 10:26
签到明日的做工
作者: clinging 时间: 2016-3-13 10:33
签到。。。。。。。。。。。。
作者: LimbSun 时间: 2016-3-13 12:38
签到and学习
作者: wt954895928 时间: 2016-3-13 12:57
很多都看不懂
作者: 从心开始のBean 时间: 2016-3-13 14:18
正在学习呢, 哈哈, 受教了
作者: 冰糖葫芦五加皮 时间: 2016-3-13 15:35
很不错呢
作者: 王建平 时间: 2016-3-13 18:55
貌似好难的样子
作者: 今天天气不错 时间: 2016-3-13 19:44
今天刚学到这里,来看看
作者: stud 时间: 2016-3-13 20:47
加油努力!
作者: zhangyawei2016 时间: 2016-3-13 21:43
qiandaole
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |