当前位置:三九宝宝网 → 宝宝教育 → 智力培养 → 正文

ios应用开发ObjectiveC内存管理基础是什么

更新:01-02 整理:39baobao.com
字体:

[海内存知己,天涯若比邻《送杜少府之任蜀州》赏析]出自初唐诗人王勃的《送杜少府之任蜀州》 城阙辅三秦,风烟望五津。 与君离别意,同是宦游人。 海内存知己,天涯若比邻。 无为在歧路,儿女共沾巾。 赏析 首联“城阙辅三秦,风烟望五...+阅读

对于我们.net开发人员来说,.net为我们提供了自动内存管理的机制,我们不需去关心内存的管理。但是iPhone开发中却是不能的。这篇文章将简述一下Objective-C的内存管理机制和方法和一些特性。 手动的进行内存管理 Cocoa和Objective-C的类都是NSObject的子类。NSObject中有几个方法进行内存管理。alloc方法为对象分配一片内存空间。dealloc方法用于释放对象的空间。

但是在我们的代码中将永远都不会使用dealloc方法,因为运行时会为你调用此方法释放内存空间。而你需要做的只是引用计数,稍后介绍什么是引用计数。 除了alloc和dealloc,NSObject的还有retain和release方法两个方法用于引用计数。retain方法给retainCount变量加1,release方法给retainCount变量减1。当使用alloc为对象分配一片内存空间的时候,retainCount会为1。

在这个对象的生命周期内,这个对象可能继续被其它变量引用。但有新的变量指向这个对象的时候,你应该调用retain方法,这样运行时才会知道有新的引用指向了这个变量,在这个对象生存期中拥有它的使用权。这个被Objective-C开发人员称之为“拥有”。例如: Foo * myFooOne = [[Foo alloc] init]; //retaincount 为1 Foo * myFooTwo = myFooOne; //myFooTwo 指向了这个对象 //retaincount 仍然为1 [myFooTwo retain]; //调用retain方法,运行时才知道myFooTwo指向了该对象,retaincount 为2 上面的代码中,myFooTwo通过调用retain方法,取得了Foo对象的拥有权。

在这个对象的生命周期中,会有很多变量来指向和引用它。指向这个对象的变量也可以通过release方法来解除这种拥有权。release方法将会告诉运行时,我已经使用完这个变量了,已经不需要它了,retainCount计数减1。 当对象的retainCount的计数大于或者等于1的时候,运行时会继续维持这个对象。当对象的retainCount为0的时候,运行时会释放这个对象,并回收它占得内存空间。

下图展示了一个Foo对象的生命周期。Foo对象首先在内存中分配一个内存空间,并且被myFooOne引用。在这个时候Foo对象的retaincount为1。 Foo * myFooOne = [[Foo alloc] init]; 第二个引用变量指向Foo对象,这个引用变量接着调用retain方法,其实也是调用Foo对象的retain方法。Foo对象的retaincount变成2。 Foo * myFooTwo = myFooOne; [myFooTwo retain]; 接着当myFooOne引用不需要的时候,通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成1。

[myFooOne release]; 但myFooTwo不在需要的时候,同样通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成0。 内存泄露 我们经常会在一个方法中声明对象,看下面这个例子: -(void) myMethod { //incorrect method NSString * myString = [[NSString alloc] init]; //retainCount = 1 Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount = 1 NSLog("Foo's Name:%", [myFoo getName]); } 这上面这个方法中,我们为myString 和myFoo分配了内存空间。

方法执行结束之后,两个变量超出了作用域的范围,所以不再有效。但是这个方法并没有releases这两个对象。所以运行时没有释放这两个变量占据的内存空间。除非你的应用程序结束,否则这两个变量占据的内存空间一直都是不可用的。我们把它称之为内存泄露。 为了防止内存泄露。无论什么时候,我们创建一个对象,或者创建一个对象的拷贝,我们都必须通过release方法释放。

-(void) myMethod { NSString * myString = [[NSString alloc] init]; //retainCount=1 Foo * myFoo = [[Foo alloc] initWithName:myString]; //retainCount=1 NSLog("Foo's Name:%", [myFoo getName]); [myFoo release]; //retainCount=0 so deallocate [myString release]; //retainCount=0 so deallocate } 弱引用 看下面的例子: -(void) myMethod { //an incorrect method Foo * myFooOne = [[Foo alloc] initWithName:"James"]; //retainCount=1 Foo * myFooTwo = myFooOne; //retainCount still 1 [myFooOne release]; //retaincount=0 so deallocated NSLog("Name:%", [myFooTwo printOutName]); //runtime error } nyFooTwo指向了Foo对象,但是没有调用retain方法,就是一种弱引用,上面的代码会在运行时报错。

因为myFooOne调用release方法。retaincount变成0,运行时,回收了对象的内存空间。然后myFooTwo调用printPutName自然就报错了,见下图说明。 总结:本文简单的介绍了一下手动的进行内存管理、内存泄露、弱引用等Objective-C的知识。

本文地址:https://www.39baobao.com/show/32_24690.html

以上内容来自互联网,请自行判断内容的正确性。若本站收录的信息无意侵犯了贵司版权,请联系我们,我们会及时处理和回复,谢谢.

以下为关联文档:

学习嵌入式Linux应用开发完全手册提供一下几种方案 一、还按照《嵌入死linux应用开发完全手册》(韦东山)的内容来,但是嵌入式l呗冒崇咆俑男臭赘幢蚀inux的开发环境自己搭建。当时我是按照《鸟哥的私房菜-基础篇...

关于嵌入式linux应用开发完全手册这本书这样交叉使用只不过是为了方便传文件,或者说是对于习惯了在windows下操作的人们而言,比较方便的一个方法。毕竟Linux下的操作很多都是命令行,很多有用的软件包不见得在Linux下...

比亚迪速锐插上内存卡音乐不响检测不到是怎么回事可能有以下几个原因: 1、内存卡的问题 排除内存卡是否损坏;更换其他品牌的内存卡试试。尝试格式化内存卡,再使用看看。此外,有的车上某种品牌内存卡兼容性不好,换个品牌就好了。...

嵌入式操作系统中的内存管理功能有哪些嵌入式系统所用到的内存管理机制主要有以下两种: 1、虚拟内存管理机制:有一些嵌入式处理器提供了MMU,在MMU具备内存地址映射和寻址功能,它使操作系统的内存管理更加方便。如果存...

操作系统的内存管理层在计算机系统中的作用它在计算机系统中的作用,大致可以从两方面体会: 对内,操作系统管理计算机系统的各种资源,扩充硬件的功能; 对外,操作系统提供良好的人机界面,方便用户使用计算机。它在整个计算机系...

系统提示虚拟内存不足游戏无法打开该怎么办是系统软件之间有冲突,必须清理有问题的软件(插件),建议你去下载一个修复和清理系统的软件,如Windows清理助手或360安全卫士,对系统木马,恶意插件进行清理,并修复IE。 许多程序运行...

苹果手机扩展内存有什么方法应用程序越来越细腻越来越大,手机里下载的东西越来越多,兴趣不断的扩展,可是手机内存却不断的捉襟见肘,我们需要扩大手机的内存才能满足我们的需要。 1、关闭短信永久储存 如果...

self view与view的区别苹果开发内存问题NSString *a1=[NSString stringWithFormat:\\\\\\\"%.2f\\\\\\\", i]; { 1: a=a1; //相当于a = [a1 assign]; a1 retainCount不增加 2: self.a=a1; //相当于 a = [a1 retain]; a...

iphone的运行内存最大是多少iPhone 6S 及iPhone 6s Plus的RAM容量为2GB,是目前苹果iPhone 手机中的最大运行内存的型号。 附iPhone 各代手机的运行内存: 一、 iPhone 3G 128M iPhone 3GS 256M 二、iPhone...