ios内存管理1-retain和release的简单使用
2013-08-26 11:00
288 查看
内存管理
范围:
任何继承了NSObject
的对象,对基本数据类型无效
原理:
每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)
每当使用 alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
给对象发送一条retain消息(即调用retain方法),可以使引用计数器值+1
给对象发送一条release消息,可以使引用计数器值-1
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则
谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或者(mutable)copy来创建一个对象,那么你必须调用release或autorelease。或句话说,不是你创建的,就不用你去释放
一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。)
谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
下面是测试代码:
新建一个基于“Command Line Tool”的工程,名为“内存管理1-retain和release的简单使用”,再新建一个Student类。
Student.h
Student.m
main.m
运行结果:
2013-08-26 10:53:14.506内存管理1-retain和release的简单使用[754:303]
count:1
2013-08-26 10:53:14.508内存管理1-retain和release的简单使用[754:303]
count:2
2013-08-26 10:53:14.509内存管理1-retain和release的简单使用[754:303]
count:1
2013-08-26 10:53:14.509内存管理1-retain和release的简单使用[754:303]
<Student: 0x100109a80>被销毁了
范围:
任何继承了NSObject
的对象,对基本数据类型无效
原理:
每个对象内部都保存了一个与之相关联的整数,称为引用计数器(auto reference count)
每当使用 alloc、new或者copy创建一个对象时,对象的引用计数器被设置为1
给对象发送一条retain消息(即调用retain方法),可以使引用计数器值+1
给对象发送一条release消息,可以使引用计数器值-1
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。
可以给对象发送retainCount消息获得当前的引用计数器值。
内存管理原则
谁创建,谁释放(“谁污染,谁治理”)。如果你通过alloc、new或者(mutable)copy来创建一个对象,那么你必须调用release或autorelease。或句话说,不是你创建的,就不用你去释放
一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease(autorelease是延迟释放内存,不用你自己去手动释放,系统会知道在什么时候该去释放掉它。)
谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release
下面是测试代码:
新建一个基于“Command Line Tool”的工程,名为“内存管理1-retain和release的简单使用”,再新建一个Student类。
Student.h
// // Student.h // 内存管理1-retain和release的简单使用 // // Created by Rio.King on 13-8-26. // Copyright (c) 2013年 Rio.King. All rights reserved. // #import <Foundation/Foundation.h> @interface Student : NSObject { int age; } @property int age; @end
Student.m
// // Student.m // 内存管理1-retain和release的简单使用 // // Created by Rio.King on 13-8-26. // Copyright (c) 2013年 Rio.King. All rights reserved. // #import "Student.h" @implementation Student @synthesize age; //重写dealloc方法,当引用计数器(auto reference count)为零的时候调用,注意,没有在.h头文件中声明的方法都属于私有方法。 - (void)dealloc{ //insert your code here... NSLog(@"%@被销毁了",self); [super dealloc];//一定要调用super的dealloc方法,而且最好放在最后面实现 } @end
main.m
// // main.m // 内存管理1-retain和release的简单使用 // // Created by Rio.King on 13-8-26. // Copyright (c) 2013年 Rio.King. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[Student alloc]init];//alloc一次,引用计数器为1 //Student *stu = [[[Studnet alloc]init] autorelease]; //这样写的话系统会在适当的地方对stu的内存进行自动回收,就不用自己写release回收了 //z代表无符号 NSLog(@"count:%zi", [stu retainCount]); [stu retain];//引用计数器变为2 NSLog(@"count:%zi", [stu retainCount]); [stu release];//引用计数器变为1 NSLog(@"count:%zi", [stu retainCount]); [stu release];//release一次,引用计数器减1,变为0,,,然后会调用dealloc方法 } return 0; }
运行结果:
2013-08-26 10:53:14.506内存管理1-retain和release的简单使用[754:303]
count:1
2013-08-26 10:53:14.508内存管理1-retain和release的简单使用[754:303]
count:2
2013-08-26 10:53:14.509内存管理1-retain和release的简单使用[754:303]
count:1
2013-08-26 10:53:14.509内存管理1-retain和release的简单使用[754:303]
<Student: 0x100109a80>被销毁了
相关文章推荐
- ios内存管理1-retain和release的简单使用
- 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,reado
- 使用 Swift 和 Objective-C 执行 iOS 内存管理的 7 个简单技巧
- 【IOS之内存管理】什么时候应该使用retain
- 10-retain和release的简单使用
- 内存管理 release retain autorelease 的简单原则
- IOS 学习之 —— 内存管理alloc,assign,retain,copy,release,autorelease
- iOS--webView的简单使用
- Masonry介绍与使用实践(快速上手Autolayout)-让IOS自动化相对布局更简单
- iOS开发UI高级—19Quartz2D简单使用(一)
- iOS —— CornerStone配置SVN,HTTP及SVN简单使用说明
- iOS开发UI基础—08应用程序管理之xib的简单使用
- iOS小明开发笔记(三) (cocoaPod的简单使用)
- iOS开发19:Storyboard的简单使用
- iOS-内存管理简单介绍
- iOS performSelector 的简单使用
- iOS多线程简单使用
- React Native中NavigatorIOS组件的简单使用详解
- iOS 使用XMPP框架开发IM聊天模块,实现简单的文字聊天
- IOS开发笔记之二十四——开发中内存管理的使用技巧汇总