在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的。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 = 1
2014-08-03 19:53:24.449 Memory[2448:303] 添加两个str元素后 strRetain = 3
2014-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 = -1
2014-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 = -1
 
NSString *string3 = [NSString stringWithString:string1];
NSLog(@"传入的变量FomatRetainCount = %d",(int)string1.retainCount);    //retainCount = 3
NSLog(@"传入的变量RetainCount = %d", (int)string3.retainCount);//retainCount = 3

​    ​    ​运行结果:

1
2
3
2014-08-03 20:18:37.240 Memory[2499:303] 传入字符串常量 RetainCount = -1
2014-08-03 20:18:37.240 Memory[2499:303] 传入的变量FomatRetainCount = 3
2014-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中的内存管理的更多相关文章

  1. Objective -C Memory Management 内存管理 第一部分

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  2. Unity游戏开发中的内存管理_资料

    内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...

  3. C++中的内存管理

    在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...

  4. cocos2dx中的内存管理机制及引用计数

    1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...

  5. Cocos2d-x开发中C++内存管理

    由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...

  6. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件能够指定父对象 QTimer *timer = QTime ...

  7. C语言中的内存管理

    开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...

  8. JNI中的内存管理(转)

    源:JNI中的内存管理 JNI 编程简介 JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互 ...

  9. javascript中的内存管理和垃圾回收

    前面的话 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存:然后,使用分配到的内存:最后,释放其内存.而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要使用垃圾回收机制.本文将 ...

  10. php中的内存管理的介绍(转)

    本篇文章给大家带来的内容是关于php中的内存管理的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.php内存管理概述——Zend引擎 由于计算机的内存由操作系统进行管理,所以 ...

随机推荐

  1. C++中const的全面总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类 ...

  2. spring静态代理

    一.代理概念 为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类 ...

  3. Android :fragment介绍

    一.关于Fragmemt 1.Fragment(片段),主要是为了支持更多的动态和灵活的用户界面设计,如平板电脑.Fragment允许组合和交换用户界面组件,而不需要更改视图层次结构.通过把Activ ...

  4. Android使用Application的好处

    如果一个应用程序有2个入口的,1个入口程序打开修改其中的内容,怎么实现另一个入口的数据也修改呢? 下面就用到Application来实现数据的共享,因为一个应用程序只有一个Application,Ap ...

  5. Red Hat5下源码安装mysql5.6过程记录

    1.安装cmake包 [root@edu soft]# tar -xzf cmake-.tar.Z [root@edu soft]# cd cmake- [root@edu cmake-]# ./co ...

  6. FreeMarker中文API手册(完整)

    FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用 ...

  7. 第一章-第十三题(该游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素有没有考虑到?)--By梁旭晖

    这款软件无疑是一个好软件,软件的开发者是有相当水平的,可以说是优秀的软件编写人员,但是也只是优秀的软件人员,术业有专攻,他们在其他方面我觉得是有很大的欠缺的. 我觉得,他们并没有抓住消费者的心理,首先 ...

  8. JavaScript判断移动端及pc端访问不同的网站

    JavaScript判断移动端及pc端访问不同的网站 现在很多网站都是分为两个版本,一个pc端的一个移动端的(响应式除外),针对这两个版本,就需要对访问的设备进行判断,如果是pc,就直接访问pc网站, ...

  9. js生成二维码 中间有logo

    描述: jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生成二维条码.此插件是能够独立使用的,体积也比较         ...

  10. C#基础_单例模式

    控制某个类型的实例数量-唯一一个 class Program { static void Main(string[] args) { test t1 = test.GetInstance(); tes ...