黑马程序员-OC内存管理

来源:互联网 发布:淘宝房源 编辑:程序博客网 时间:2024/05/20 11:19
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];//此时引用计数为1NSLog(@"  %d",[dog retainCount]);[dog retain];//引用计数变成2[dog release];//引用计数变成1[dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存


自动释放池的相关用法

(1)cocoa中的自动释放池(Autorelease pool),是能够自动释放池中的对象的。NSObject类提供了一个autorelease消息,当

我们向一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。如果要向使用使用自动释放池释放对象,我们首先要有一个入池操作:

//创建自动释放池@autoreleasepool{}
自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放

池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。


(2)向自动释放池发送release及drain消息的区别

 当我们向自动释放池pool发送release消息时,它会向池中的每一个发送了autorelease消息的对象发送一条release消息,并且自身也会销毁。当向它发送drain

消息时,只会释放里面吧的对象,而不会销毁自己。


0 0
原创粉丝点击