iphone 内存管理2
iPhone 开发过程中,内存的使用至关重要。不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃。根据个人开发的经验来看,在开发iPhone程序的过程中,关于内存的问题需要注意以下几点:
- 内存分配、释放成对出现
使用 alloc 分配的内存对象需要在用完后 调用release释放 - 注意copy,retain,assign操作符的区别
copy, retain操作符赋值的对象和alloc一样,需要release释放,否则会导致内存泄露
assign 操作符的含义是将对象指向另一对象, 两者指向的是同一内存对象,无需调用release释放 - NSArray, NSDictionary, NSMutableArray, NSMutableDictionary等容器类, 在使用这些容器类的时候要注意, 在添加对象到这些类对象时,容器类会自动调用一次retain,比如
NSString* string = [[NSString alloc] initWithString:@”test string”]; // refCount = 1
NSArray* array = [NSArray array];
[array addObject:string]; // refCount = 2
[string release]; // refCount = 1
这种情况, 即便string已经调用release,但是在加入 array中时已经调用了一次retain,注意refCount的变化简单介绍一下iPhone 或者说Objective C对对象的管理机制。 OC中采用一种引用计数refCount的方式来管理内存对象,当refCount等于0的时候就会释放对象所占的内存, 操作符alloc,copy, retain都会将refCount加1表示引用计数增加, 而调用release使 refCount自动减1, 当refCount=0时表示该对象已经没有被引用,可以将其释放, 之后该对象便不可用
- 连续重复分配内存的过程最好创建自己的自动释放池 NSAutoreleasePool,通常是在for、while等循环操作过程中,比如
for( int i=0; i < 100; i++ )
{
NSString* str = [[NSString alloc] initWithString:@”some string”];
// 针对str的操作
[str release];
}
在这种情况下,有2点需要注意,首先如果可能,就把str的分配、释放放在for循环外面, 从而减少内存的分配、释放导致程序效率低下,也利于内存回收,如上例应该为
NSString* str = [[NSString alloc] initWithString:@”some string”];
for( int i=0; i < 100; i++ )
{
// 针对str的操作
}
[str release];
如 果实际情况复杂,不能像例子中那样抽离出循环外,需要创建自己的内存管理池, 同样适用于需要大量autorelease对象的过程
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
for(int i=0; i < 100; i++ )
{
// actions
}
[pool release];
之所以要这样做,是因为apple处理iPhone的内存管理 机制问题, 通常情况下,系统会在需要的时候释放整理所有的autorelease对象,这就是为什么有时候autorelease对象在作用域范围外还有可能是有效 的 - 避免不常用对象驻留内存, 桌面开发的tx很多喜欢在程序初始化的时候将某些资源比如小图片加载进内存,从而提高程序运行效率。 但这种方式在iPhone以及其它mobile移动设备开发时需要避免,因为对于这些设备来说,内存永远显得不足(当然普通pc内存也是越大越好:) )。 按照apple的官方说法, Load resources lazily . 就是在需要的时候再从硬盘上读取,而避免常驻内存。
iphone 内存管理2相关推荐
- iPhone内存管理详细解说(二)
继上一篇之后,再来讲述iPhone内存管理的细节. 四:动态内存管理 第四节就内容实质来说跟第三节的object的拥有和丢弃政策是一样的,不过是从以代码为引导的动态形式讲述.所以你会在这一节看到许多代 ...
- iphone内存管理
http://hi.baidu.com/spopavenvldiqyr/item/c8d620b6282c4d4abb0e122a iphone内存管理(一) BY 洋葱头 http://hi.bai ...
- iPhone内存管理详细解说(一)
iPhone内存管理详细解说系列转载来源:http://keywind.me/blog/2011/05/07/iphonenei-cun-guan-li-xiang-xi-jie-shuo-yi/ 感 ...
- iphone内存管理(一)
内存管理在iphone中一直是一个热点话题.通过一段时间的总结我准备与大家分享一下我对内存管理的一点认识和经验. 开始之前先给大家分享一些重要的信息 1.Iphone 3g有128M的内存.但是至少有 ...
- iphone内存管理(二)
(2)尽量避免使用autorelease 虽然autorelease非常简单有用,但是在iphone上一定要谨慎使用,毕竟iphone内存相当有限.autorelease可能会导致直接的隐型内存泄露. ...
- ipad/iphone内存管理一
在我们iPhone/iPad项目中,程序会无缘无故地crash!这让我们非常的苦恼!现在我结合网上的一些资料,并根据自己的理解,和大家一起探讨内存管理这方面的知识.大家有什么不理解的可以直接给我留言. ...
- iphone内存管理的具体问题解决方案
iPhone 开发内存管理 开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有m ...
- iphone 内存管理1
开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有memory leak ,杀掉 ...
- iPad/iPhone内存管理四之viewDidUnload/dealloc详细解说
在进行内存管理时,我们必须要知道这两者的区别时什么. viewDidUnload是在程序接到内存警告的时候调用的,在这时候,我们可以把我们不需要的东西去掉或者让他等于nil. dealloc是在计数等 ...
最新文章
- [Abp vNext 源码分析] - 1. 框架启动流程分析
- Web前端工作笔记011---ztree的使用方法_大全
- 比较好玩的动态添加网页元素
- LeetCode 111. Minimum Depth of Binary Tree (二叉树最小的深度)
- pandas获取索引行数据
- JVM - 对象访问
- 编写一个UNIX文件系统
- mysql 批量插入 优化_mysql 批量插入优化之rewriteBatchedStatements
- 《英雄联盟》“被手游”背后,是移动电竞的成长期“烦恼”
- jQuery Mobile 【弹窗】
- Scrapy(爬虫)中文手册
- ]获取android应用的MD5签名
- 基于博客系统的访客日志记录
- OpenCms创建网站过程图解——献给OpenCms的初学者们
- Linux下释放内存
- 三段式与四段式耳机插头的区别
- WEB 应用中的整体结构和层次关系
- 下面整理了几种让网页变灰色的CSS代码,供各位站长参考!
- 文献分析-基于AI的文献分析工具
- 现实!程序员只有跳槽才能涨薪吗?