iOS开发--漫谈内存管理(一)
2015-06-28 18:07
411 查看
1、MRC与ARC
苹果提供两种内存管理机制:一种是MRC(manual reference count),即手动引用计数;另一种是ARC(auto reference count),即自动引用计数。手动引用计数,顾名思义,需要程序员主动调用retain、release等方法来管理内存,而自动引用计数方式,则是编译器在编译阶段把内存管理代码自动插入在需要手动调用的地方。这样就把程序员从复杂的内存管理工作中解放出来,将更多精力放在实现具体的业务逻辑上。需要注意的是,ARC要在xcode4.2或者以上版本、LLVM编译器3.0版本下才能使用。
2、引用计算的实现方式
一种是GNUStep的实现方式:对象生成的时候,在对象的头部添加retained属性,表示该对象的引用计数,retain方法调用时retained加1,release方法被调用时,retained减1,当retained计数为0时,释放该对象。
一种是苹果的实现方式:引用计数表,表的大概形式{对象A的引用计数:对象A的内存地址,对象B的引用计数:对象B的内存地址,..... ,对象N的引用计数:对象N的内存地址}。
3、内存管理的思考方式
a、自己生成的对象,自己持有
b、非自己生成的对象,自己也能持有
c、不再需要自己持有的对象时释放
d、非自己持有的对象无法释放
新手可能很难注意并理解第二条规则,它是如何做到的呢,实现方式大概如下:
4、关于autorelease
autorelease使用对象在超出制定的生存范围时能够自动并正确释放,类似于c语言中的自动变量。autorelease的典型用法如下:
PS:文章大部分思想摘自《Objective-C高级编程》一书,权当个人读书总结吧。
苹果提供两种内存管理机制:一种是MRC(manual reference count),即手动引用计数;另一种是ARC(auto reference count),即自动引用计数。手动引用计数,顾名思义,需要程序员主动调用retain、release等方法来管理内存,而自动引用计数方式,则是编译器在编译阶段把内存管理代码自动插入在需要手动调用的地方。这样就把程序员从复杂的内存管理工作中解放出来,将更多精力放在实现具体的业务逻辑上。需要注意的是,ARC要在xcode4.2或者以上版本、LLVM编译器3.0版本下才能使用。
2、引用计算的实现方式
一种是GNUStep的实现方式:对象生成的时候,在对象的头部添加retained属性,表示该对象的引用计数,retain方法调用时retained加1,release方法被调用时,retained减1,当retained计数为0时,释放该对象。
一种是苹果的实现方式:引用计数表,表的大概形式{对象A的引用计数:对象A的内存地址,对象B的引用计数:对象B的内存地址,..... ,对象N的引用计数:对象N的内存地址}。
3、内存管理的思考方式
a、自己生成的对象,自己持有
id obj = [[NSObject alloc] init]; //此时,对象被生成,并且obj持有该对象。该系列方法包括:alloc、new、copy和mutableCopy
b、非自己生成的对象,自己也能持有
id obj = [NSMutableArrray array];//对象被生成,且obj指向该对象,但是obj并不持有该对象,需要调用[obj retain]才能真正持有
c、不再需要自己持有的对象时释放
d、非自己持有的对象无法释放
新手可能很难注意并理解第二条规则,它是如何做到的呢,实现方式大概如下:
- (id) object { //对象生成,并且obj持有该对象 id obj = [[NSObject alloc] init]; //取得对象存在,但自己不持有该对象 [obj autorelease]; return obj; }
4、关于autorelease
autorelease使用对象在超出制定的生存范围时能够自动并正确释放,类似于c语言中的自动变量。autorelease的典型用法如下:
NSAutoReleasePool *pool = [[NSAutoReleasePool] alloc init]; id obj = [[NSObject alloc] init]; [obj autorelease]; [pool drain]; //pool对象废弃时,[obj release]方法自动被调用
PS:文章大部分思想摘自《Objective-C高级编程》一书,权当个人读书总结吧。
相关文章推荐
- iOS开发基础笔记-算法<三>
- iOS 阶段学习第十天笔记(结构体)
- ios8.3 越狱之后,没有ps,top等命令
- 解决iOS Xcode 模拟器键盘不弹出
- iOS 并行开发技术之 NSOperation && GCD
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
- iOS日志获取
- iOS 单元测试之XCTest详解(一)
- 在iOS 中创建自定义Delegates properties with ARC错误的解决方法
- 苹果开发 笔记(42)leftBarButtonItem
- nagios 安装和配置(含有nrpe结束)所有 (两)
- nagios安装和配置(个人笔记)
- iOS 阶段学习第九天笔记(内存管理)
- iOS 集成环信, 扩展属性, chatcell label 可被点击
- iOS开发学习笔记(二)—— 让图片“动”起来!
- iOS中四种实例变量的范围类型@private@protected@public@package
- iOS block的用法
- 安装nagios框架
- iOS毛玻璃效果的实现
- iOS中系统唯一标识ID