为什么需要进行内存管理,如果一个程序所占用的内存达到一定值时系统就会发出警告,当这个值达到峰值的时候程序就会闪退,所以为了程序执行的流畅,用户更好的体验,必须进行内存管理。
Objective-C是通过引用计数的机制来管理内存的,管理的范围就主要是基于NSObject的子类,对基本数据类型无效。通过对引用计数的控制来决定是否要释放内存,如果对象的引用计数为0,那么就会调用对象的dealloc方法来释放该对象的内存,这里需要注意的是并不是调用release方法销毁对象,release只会将对象引用计数减1,我们在使用对象的过程中大部分引用计数都为1,所以调用release确实可以达到释放内存的效果,但要注意他的实质还是引用计数为0才会销毁对象。
在Objective-C中copy、retain、alloc和将对象添加到数组中都会使对象引用计数+1,在iOS4.0之后苹果引入了ARC内存自动管理,但是我们还是需要明白其原理,有的时候可能也需要我们自己加入一些局部的内存管理。比如当我们使用for循环的时候,在循环内创建了对象,而对象都放入自动释放池里面,只有当自动释放池被销毁的时候才会释放内存,那么自动什么时候释放呢?通过Observer监听Runloop的状态,一旦监听到Runloop进入睡眠状态就会释放自动释放池。那么当for循环内的对象创建分配空间已经超出了内存的大小就会造成内存溢出,那么就需要我们在for循环内加入自动释放池:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
[pool drain];
这样防止内存溢出,当然这种情况可能不会出现。
或者for循环比较大,我们也可以使用@autoreleasepool {} 放在for循环外,for循环结束后释放对象,解决占用栈区内存问题。
网友评论