很多面试的情况下ITO都喜欢问你一些内存管理方面的问题,通常会这样开始:
你了解iOS的内存管理么?说一下你对iOS内存管理的理解?然后你会说一下什么黄金法则,自动引用计数什么的。然后又会问你一句还有么,然后呢?是不是瞬间懵逼了,你会想就这么多呀,还有什么呀?
我觉得类似这样的问题应该分类进行回答,就iOS内存管理来说我是这么回答的:iOS内存管理分MRC和ARC两种情况下,
MRC
在iOS5之前是MRC它的内存是需要开发者自己去管理的也就是我们说的手动管理内存,(这时你可以说iOS内存管理的黄金法则了):
凡是使用alloc、init、copy、nsmutablecopy、retain进行创建对象的都要使用release或者autorelease进行释放;(附加release和autorelease的区别?)
规则:
1、Objective-C类中实现了引用计数器,对象知道自己当前被引用的次数
2、最初对象的计数器为1
3、如果需要引用对象,可以给对象发送一个retain消息,这样对象的计数器就加1
4、当不需要引用对象了,可以给对象发送release消息,这样对象计数器就减1
5、当计数器减到0,自动调用对象的dealloc函数,对象就会释放内存
6、计数器为0的对象不能再使用release和其他方法
ARC
在ARC内存管理模式下,其属性的标识符有assign,strong,weak,copy;
@property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默认为unsafe_unretained
(1)assign在arc中修饰的是基本数据类型,mrc中修饰的是delegate防止强强循环引用造成内存泄漏。(自己查找一下什么是强强循环引用,如果不明白的话)
(2)strong相当于mrc中的retain,使得对象被引用时引用计数加1.
(3)weak的作用相当于assign,弱引用使用的对象。在arc中delegate的修饰词是weak。作用防止循环引用造成内存泄漏。但是assign和weak是有区别的:
首先assign修饰的是基本数据类型,简单赋值不改变引用计数,weak只可以修饰oc中的对象。其次arc环境下weak修饰的对象被释放后指向对象的指针会被自动置为nil,而assign修饰的变量可能不会被置为nil,造成野指针会导致程序crash。
(4)copy修饰的类型一般是NSString,NSArray,NSDictionary。建立一个索引计数为1的对象,然后释放旧对象。
基本上你能想起来的也就是这么多了,然后面试官就会问还有么?其实我也懵逼了一下,接下来我就会从内存管理的好处说:iOS内存管理机制的好处就是为了让开发人员方便的管理内存,减少程序中的内存泄漏,在内存管理难度与性能之间找一个最佳的平衡点。(其实就一句话,说完我就附上一句话,对于内存管理我暂时就了解这么多)
网友评论