iOS开发系列—Objective-C之内存管理

iOS开发系列—Objective-C之内存管理

ID:37711305

大小:26.50 KB

页数:13页

时间:2019-05-29

iOS开发系列—Objective-C之内存管理_第1页
iOS开发系列—Objective-C之内存管理_第2页
iOS开发系列—Objective-C之内存管理_第3页
iOS开发系列—Objective-C之内存管理_第4页
iOS开发系列—Objective-C之内存管理_第5页
资源描述:

《iOS开发系列—Objective-C之内存管理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、iOS开发系列—Objective-C之内存管理概述我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如C#、Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护。今天将着重介绍ObjC内存管理:引用计数器属性参数自动释放池引用计数器在Xcode4.2及之后的版本中由于引入了

2、ARC(AutomaticReferenceCounting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代码,如果编写手动释放代码Xcode会报错,因此在今天的内容中如果你使用的是Xcode4.2之后的版本(相信现在大部分朋友用的版本都比这个要高),必须手动关闭ARC,这样才有助于你理解ObjC的内存回收机制。ObjC中的内存管理机制跟C语言中指针的内容是同样重要的,要开发一个程序并不难,但是优秀的程序则更测重于内存管理,它们往往占用内存更少,运行更加流畅。虽然在新版Xcode引入了ARC,但是很多时候它并不能完全解决你的问题

3、。在Xcode中关闭ARC:项目属性—BuildSettings--搜索“garbage”找到Objective-CAutomaticReferenceCounting设置为No即可。内存管理原理我们都知道在C#、Java中都有GC在自动管理内存,当我们实例化一个对象之后通常会有一个变量来引用这个对象(变量中存储对象地址),当这个引用变量不再使用之后(也就是不再引用这个对象)此时GC就会自动回收这个对象,简单的说就是:当一个对象没有任何变量引用的时候就会被回收。例如下面的C#代码片段usingSystem;namespaceGC{class

4、Program{privatestaticvoidTest(){objecto=newobject();}staticvoidMain(string[]args){Test();}}}上面是一段C#代码,在Test()方法中,通过newObject()创建了一个对象,o是一个对象的引用(存储了对象的地址),它是一个局部变量,作用范围就是Test()方法内部。image当执行完Test()方法之后o就会被释放,此时由于没有变量在引用newObject()这个对象,因此GC会自动回收这个对象所占用的空间。但是在ObjC中没有垃圾回收机制,那么O

5、bjC中内存又是如何管理的呢?其实在ObjC中内存的管理是依赖对象引用计数器来进行的:在ObjC中每个对象内部都有一个与之对应的整数(retainCount),叫“引用计数器”,当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。下面通过一个简单的例子

6、看一下引用计数器的知识:Person.h////Person.h//MemoryManage////KenshinCuion14-2-15.//Copyright(c)2014年KenshinCui.Allrightsreserved.//#import@interfacePerson:NSObject#pragmamark-属性@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)intage;@endPerso

7、n.m////Person.m//MemoryManage////KenshinCuion14-2-15.//Copyright(c)2014年KenshinCui.Allrightsreserved.//#import"Person.h"@implementationPerson#pragmamark-覆盖方法#pragmamark重写dealloc方法,在这个方法中通常进行对象释放操作-(void)dealloc{NSLog(@"InvokePerson'sdeallocmethod.");[superdealloc];//注意最后一定

8、要调用父类的dealloc方法(两个目的:一是父类可能有其他引用对象需要释放;二是:当前对象真正的释放操作是在super的dealloc中完成的)}@endmain.m////m

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。