1.为什么要进行内存管理。
由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。
管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。
本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。
2.OC采用了一种称为引用计数的方法来判断对象的使用寿命。每个对象有一个与之相关联的整数,称为它的引用计数。
当某段代码需要访问一个对象时,改代码将改对象的引用计数值加1,表示“我要访问该对象”。当这段代码结束对象访问时,将对象的引用计数值减1,。
当引用计数值为0时,表示不再有代码访问该对象,因此对象将被销毁,其占用的内存被系统回收以便重用。
retain:增加对象的引用计数
release:减少对象的引用计数
当对象被创建的时候,引用计数的值为1。
当发送retain消息的时候,该对象的引用计数加1,该对象的引用计数为2。
当这个对象发送release消息的时候,该对象的引用计数减1。
当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。
3.内存管理规则
1)当你使用new、alloc或copy方法创建一个对象时,该对象的引用计数值为1.当不再使用该对象时,要负责向该对象
发送一条release或autorelease消息。这样,该对象将在其使用寿命结束时被销毁、
2)当你通过任何其他方法获得一个对象时,则假设该对象的引用计数为1,而且已经被设置为自动释放,你不需要执行任何
操作来确保该对象被清理。如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
3)如果你保留了某个对象,你需要释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
Dog *dog = [[Dog alloc]init];//此时引用计数为1
NSLog(@" %d",[dog retainCount]);
[dog retain];//引用计数变成2
[dog release];//引用计数变成1
[dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存
|
|