内存管理不是一个简单的问题,IOS平台的开发者,多数都为内存问题而苦恼。内存莫名的持续增长,程序莫名的crash,难以发现的内存泄露,这些都是IOS平台内存相关的常见问题。
内存管理是程序设计中常用的资源管理的一部分。每个计算机系统可供程序使用的资源都是有限的,这些资源包括内存、打开文件数量以及网络连接等。
IOS系统为每个程序分配30MB的内存,超过20MB会收到内存警告,如果超过30MB,系统将会终止你的应用程序,也就是闪退。
IOS内存管理的原理是——引用计数。
1、每一个对象都有一个引用计数;
2、对象被创建的时候,引用计数的值为1;
3、当引用计数值为0的时候,对象被系统销毁。
获得内存所有权的方法:
1)、alloc:为新对象分配内存,引用计数置1.
2)、retain:使对象的引用计数+1,并获得对象的所有权。
3)、copy:制造原有对象的副本,该副本的引用计数为1,调用拥有该副本的所有权,并在赋值前释放原有对象,然后再进行赋值。
放弃所有权的方法:
1)、release:使对象的引用计数在未来某个时候减1,并且在那个时候放弃对象的所有权。
2)、autorelease:使对象的引用计数在未来某个时候减1,并且在那个时候放弃对象的所有权,而当前引用计数并没有变。
内存管理原则:
1、对你拥有的对象负责。你只能释放你拥有的对象。
2、凡是你通过retain,alloc,copy等手段获得了所有权的对象,都必须在你不再使用它的时候,由你来调用release,autorelease等手段来释放对它的所有权。
3、在一定的代码段内,对同一对象所做的copy,alloc和retain的操作次数应当与release和autorelease的操作次数相等。
4、可以在类的dealloc方法中释放你所占用的实例变量;
5、对于便利构造器和访问器无需进行内存管理;
6、autorelease意味着延迟了一条release消息,当前引用计数没有变。
Xcode4.2及以上版本有了自动管理内存,及ARC机制,在缺省工程模板中,可以指定工程是否支持ARC,若不指定ARC,在代码中必须使用管理内存的代码来管理内存。