Objective-C中的内存管理
在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的。OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象是时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现);当计数器为0时,该对象占用的内存空间会被收回。在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值。
在XCode4以后的版本采取自动引用计数(Automatic Reference Counting)简称ARC, 默认的是ARC模式,在ARC下是不能直接调用retain,release, releaseCount等方法的,需要在XCode中进行设置,设置如下: 把Objective-C Automatic Reference Counting 改为NO,即可。
之前提到的NSOject类里有个方法,retainCount可以获取当前对象的引用计数的值,废话少说上点代码吧。
1. 用可变的数组结合着可变的字符串来观察一下retainCount的变化。
(1).先创建一个可变数组对象,在创建一个可变字符串对象;
(2).然后往可变数组里添加可变的字符串,观察可变字符串的retainCount的变化。
(3).在可变数组中移除一个str,观察retainCount的变化
(4)我们为什么要用可变的字符串呢?稍后会提到为什么。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//用可变数组来测试内存的访问 NSMutableArray *array = [NSMutableArray arrayWithCapacity:3]; //可变的字符串 NSMutableString *str = [[NSMutableString alloc] initWithString:@"aa"]; //这时的retain = 1; NSLog(@"新建str时的 strRetain = %d",(int)[str retainCount]); //把可变字符串对象传入到可变数组中 NSMutalbe的retain会自动加一 //把对象传给另一个对象,此时的retain = 2; [array addObject:str]; //retain =3; [array addObject:str]; NSLog(@"添加两个str元素后 strRetain = %d",(int)str.retainCount); //移除元素 [array removeObjectAtIndex:0]; NSLog(@"移除一个元素后 strRetain = %d",(int)str.retainCount); |
运行的结果:
|
1
2
3
|
2014-08-03 19:53:24.449 Memory[2448:303] 新建str时的 strRetain = 12014-08-03 19:53:24.449 Memory[2448:303] 添加两个str元素后 strRetain = 32014-08-03 19:53:24.450 Memory[2448:303] 移除一个元素后 strRetain = 2 |
2.NSString的retainCount的变化
用NSString声明的字符串变量的retainCount变化由你初始化字符串时的方式决定
1. 用NSString *str = @"ludashi";定义变量
用上面的方法定义的字符串是常量字符串,他的retianCount为-1或不定,不会随着retian或者release变化而变化
demo如下:
|
1
2
3
4
|
NSString *string = @"aa";NSLog(@"str常量的retainCount = %d",(int)string.retainCount);//retainCount = -1[string retain]; //没用NSLog(@"str常量的retainCount = %d",(int)string.retainCount);//retainCount = -1 |
运行结果:
|
1
2
|
2014-08-03 20:01:31.360 Memory[2463:303] str常量的retainCount = -12014-08-03 20:01:31.362 Memory[2463:303] str常量的retainCount = -1 |
2.使用stringWithFormat创建的NSString为变量,系统会进行引用计数。
demo:
|
1
2
3
4
|
/*使用stringWithFormat创建的NSString为变量,系统会进行引用计数。*/NSString *string1 = [NSString stringWithFormat:@"aaaa"];[string1 retain];NSLog(@"NSStringFomatRetainCount = %d",(int)string1.retainCount);//retainCount = 2 |
运行结果:
|
1
|
NSStringFomatRetainCount = 2 |
3 .stringWithString取决于后面跟的string, 后面string的retainCount是多少那么用stringWithString创建的对象就为多少
demo:
|
1
2
3
4
5
6
7
|
/*stringWithString取决于后面跟的string, 后面string的retainCount是多少那么用stringWithString创建的对象就为多少*/NSString *string2 = [NSString stringWithString:string];NSLog(@"传入字符串常量 RetainCount = %d", (int)string2.retainCount);//retainCount = -1NSString *string3 = [NSString stringWithString:string1];NSLog(@"传入的变量FomatRetainCount = %d",(int)string1.retainCount); //retainCount = 3NSLog(@"传入的变量RetainCount = %d", (int)string3.retainCount);//retainCount = 3 |
运行结果:
|
1
2
3
|
2014-08-03 20:18:37.240 Memory[2499:303] 传入字符串常量 RetainCount = -12014-08-03 20:18:37.240 Memory[2499:303] 传入的变量FomatRetainCount = 32014-08-03 20:18:37.240 Memory[2499:303] 传入的变量RetainCount = 3 |
Objective-C中得ARC(Automatic Reference Counting)
1.ARC中应注意的问题:
(1). 不能显式调用dealloc语句, 或者实现或调用retain, release, retianCount 和 autorelease等方法。
(2).不能调用@selector (retain) ,@selector (release)等;
(3).不能使用NSAutoreleasePool对象, 用@autoreleasepool块来代替;
(4).不能用开头new的名称来定义一个属性,除非你定义一个别的getter名称。
2.ARC特性
ARC增加了新的属性定义关键字,strong来代替retain,表示强引用。用weak来代替assign表示弱引用。
Objective-C中的内存管理的更多相关文章
- Objective -C Memory Management 内存管理 第一部分
Objective -C Memory Management 内存管理 第一部分 Memory management is part of a more general problem in pr ...
- Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
- C++中的内存管理
在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...
- cocos2dx中的内存管理机制及引用计数
1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...
- Cocos2d-x开发中C++内存管理
由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...
- 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
一 QT的内存管理 1 QT中的内存管理是QObject来管理的 2 QT中的内存管理没有cocos2dx中的引用计数 3 组件能够指定父对象 QTimer *timer = QTime ...
- C语言中的内存管理
开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...
- JNI中的内存管理(转)
源:JNI中的内存管理 JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互 ...
- javascript中的内存管理和垃圾回收
前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...
- php中的内存管理的介绍(转)
本篇文章给大家带来的内容是关于php中的内存管理的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.php内存管理概述——Zend引擎 由于计算机的内存由操作系统进行管理,所以 ...
随机推荐
- windows下装多个node版本的方法(gnvm)
安装一个支持windows切换node版本的工具 工作中我们可能需要用到一些工具,但这些工具依赖不同版本的node环境,那我们需要来为的切换node的环境吗, window msi安装的用户需要卸 ...
- nodemailer 发邮件
var transporter = nodemailer.createTransport({//v1.0 above do not use 'SMTP' as first param host: &q ...
- composer安装
1.首先到php.net下载对应版本的php,zip版本即可,注意windows需要vc11运行库支持 2.配置path路径添加对php解压目录的引用 3.将php.ini-development ...
- ios 定位
ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...
- [Window Title] (没有登录) [Content] ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 [OK]
重启Oracle服务
- ExtJS扩展:扩展grid之toolbar button禁用表达式
在前一篇文章我们扩展了grid通过选中记录数来禁用toolbar上的按钮,有时候我们需要通过记录中的数据来决定是否禁用按钮,今天我们就来扩展它. 照例,最新的代码和例子都在gi ...
- Centos 使用YUM安装MariaDB
1.在 /etc/yum.repos.d/ 下建立 MariaDB.repo,内容如下: [azureuser@mono etc]$ cd /etc/yum.repos.d [azureuser@mo ...
- ABP框架理论学习之Debugging
返回总目录 所有的官方ABP nuget包都是支持GitLink的,这意味着你可以在项目中轻松地调试所有的以Abp为前缀的Nuget包. 要开启这项支持,"启用源服务器支持"选项应 ...
- Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
<Windows Azure Platform 系列文章目录> 前提要求: 1.假设笔者捕获一个Azure虚拟机模板,命名为leistorage 关于Azure虚拟机模板,请参考下图: 2 ...
- Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路
通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点.从而导致DatePicker控件在选择日期后无法 ...