IOS开发基础Object-C(07)—OC内存管理(1)-retain和release
来源:互联网 发布:网络信息发布规定 编辑:程序博客网 时间:2024/05/24 07:09
前面我们已经说过,OC不同于Java的地方就是没有垃圾回收机制,在内存管理这块,cocoa引入了一种称为引用计数(reference counting)的技术,有时也叫保留计数,每个对象有一个与之对关联的整数,称作它的引用计数器或保留计数器.当某段代码要访问一个对象的时候,该代码将该对象的保留计数值加1,表示”我要访问该对象”,当这段代码结束对象访问时,将对象的保留计数值减1,表示它不再访问该对象,当保留计数值为0时,表示不再有代码访问对象了,对象被销毁,其占用的内存被系统回收。
我来简单说一下原理:
1、每个对象内部都保存了一个与之关联的整数,称之为引用计数器,当使用alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1;
2、给对象发送一个retain消息(调用retain方法),可以使计数器+1;
3、给对象发送一个release消息(调用release方法)或者autorelease消息,可以使计数器-1;
4、当一个对象的引用计数为0时,那么他将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关资源,一定不要直接调用dealloc方法。
5、发送retainCount消息获得当前的引用计数器的值。
注:我们这里说的发送消息就是调用方法
- (id)retain; // 计数器+1
- (void)release; //计数器-1
- (id)autorelease;//计数器-1
- (unsigned)retainCount;//获得当前引用计数器的值
在这里大家就会疑惑了,怎么的对象才需要我们管理内存呢?可以这么说,任何继承了NSObject的对象都需要管理内存。基本数据类型,像int ,float,double,int类型的指针数组什么的都不需要管理内存。
我们来看一下例子依照惯例,我们还是来创建一个类:
Student.h
#import<Foundation/Foundation.h>@interface Student :NSObject@property int age; //声明一个getter方法、setter方法@end
Student.m
#import "Student.h"@implementation Student@synthesize age=_age; //在xcode4.5环境下可以省略//验证对象有没有被回收-(void)dealloc{ NSLog(@"%@被销毁了",self);//验证对象有没有被回收 [super dealloc];//一定要到调用super的dealloc方法,而且最好是在最后调用}@end
我们在main.m中测试一下
#import<Foundation/Foundation.h>#import"Student.h"int main(int argc,const char *argv[]){ @autoreleasepool{ Student *stu=[[Student alloc]init];//调用了alloc方法,计数器为1 [stu release];//释放,计数器为0; } return 0;}
在前边我们有提到,在销毁对象的时候,OC也会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关资源,一定不要直接调用dealloc方法。所以我们用dealloc方法来验证对象是否被销毁。
如果对象被回收以后(retainCount=0),再发送一条release消息,就会发生野指针错误。
#import<Foundation/Foundation.h>#import"Student.h"int main(int argc,const char *argv[]){ @autoreleasepool{ Student *stu=[[Student alloc]init];//调用了alloc方法,计数器为1 [stu release];//释放,计数器为0 [stu release];//计数器为0,再次释放则会发生野指针错误,也就是说访问了你不该访问的内存 } return 0;}
autorelease的实现
还有一种情况,如果方法名并不以alloc、new、copy开头,比如:
+ (NSArray *)array { return [[NSArray alloc] init] autorelease]; }
程序内部调用了alloc,就需要调用release来释放,所以我们采用了一种自动释放机制autorelease,其中具体原理先不深究,后面我会详细讲解。
内存管理原则:
1、谁创建,谁释放(“谁污染,谁治理”),如果你通过alloc、new或者copy来创建一个对象,那么你必须调用release或者autorelease来释放,换句话说,不是你创建的,你就不用释放
2、一般来说,除了alloc、new或者copy之外的方法创建的对象,都被声明了autorelease
3、谁retain,谁release,无论这个对象是怎样生成的
视频链接
http://pan.baidu.com/s/1ntMpRQT
- IOS开发基础Object-C(07)—OC内存管理(1)-retain和release
- IOS开发基础Object-C(10)—OC内存管理(4)-autorelease使用
- IOS开发基础Object-C(08)—OC内存管理(2)-对象之间的内存管理
- IOS开发基础Object-C(09)—OC内存管理(3)-@property的参数详解
- Objective-C 内存管理retain和release
- ios内存管理1-retain和release的简单使用
- ios内存管理1-retain和release的简单使用
- 黑马程序员——IOS基础——OC内存管理循环retain和autorelease
- OC学习笔记-内存管理、retain、release和retainCount
- 内存管理1retain和release
- OC学习笔记四-1 内存管理(Retain-Release)
- iOS开发之OC语法基础(四)--内存管理
- Objective-c 内存管理-MRC retain&release
- Object-C 基础之8 — 内存管理(1)
- IOS开发基础Object-C(01)— OC概述及比较
- IOS开发基础Object-C(02 )—第一个OC类
- IOS开发基础Object-C(05)—OC变量的作用域、self
- cocos2d-x内存管理retain和release
- TrueCrypt的安装和使用
- Android适配之适配不同语言,即国际化
- [MSSQL]SQL Server 事务语法
- EJB,到底什么是EJB?
- (总结)try{}catch{}中有return,finally{}的执行情况
- IOS开发基础Object-C(07)—OC内存管理(1)-retain和release
- JDK动态代理实现原理--转载
- Encription
- 【大渣】【KMP】字串清除
- 错误整理(四)乱码问题
- 利用javaMail发送邮件
- map遍历方法
- Android学习--DatePicker和TimePicker使用
- Servlet 文件上传