A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wlh0803 中级黑马   /  2015-9-21 18:08  /  922 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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方法,销毁对象,回收内存  

1 个回复

倒序浏览
感谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马