ios内存管理1-retain和release的简单使用
来源:互联网 发布:软件开发技术发展方向 编辑:程序博客网 时间:2024/05/24 05:44
内存管理
范围:
- 任何继承了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的简单使用
- ios内存管理1-retain和release的简单使用
- 内存管理1retain和release
- 10-retain和release的简单使用
- 内存管理 release retain autorelease 的简单原则
- ios笔记--retain,release介绍和setter方法的内存管理笔记
- IOS开发基础Object-C(07)—OC内存管理(1)-retain和release
- cocos2d-x内存管理retain和release
- 内存管理中的retain和release用法
- Objective-C 内存管理retain和release
- cocos2d 内存管理,retain,release的疑问
- retain和release 的使用
- OC学习笔记-内存管理、retain、release和retainCount
- 随笔-浅谈内存管理的常用词:alloc、retain、dealloc、release
- OC学习笔记四-1 内存管理(Retain-Release)
- cocos2d-x 内存管理 retain release
- Objective-c 内存管理-MRC retain&release
- retain 和 release成对使用
- oracle修改密码及账户锁定
- 关于typedef的用法总结
- ThinkPHP 控制器高级特性
- lucene中Field.Index,Field.Store的一些设置
- android sms(短信)详解
- ios内存管理1-retain和release的简单使用
- Java+7入门经典 - 5 类 Part 2/2
- 递归调用时的参数写法之引用&
- 常用编辑工具的Tab键空格数设置
- 用 new 还是用 alloc/init
- ML的相关资源汇总
- Java文件编译的两种方式以及在SpringMVC传参中带来的问题
- C#--整型与字节数组byte[]之间的转换
- MultiByteToWideChar和WideCharToMultiByte用法详解