iphone开发--内存管理
内存管理是iphone开发中很重要的一个环节,没有处理好会是系统出现很多问题,
很严重的一个就是直接导致程序闪退。因此,内存管理是很让新手头疼的,也是新手晋
级为菜鸟必走的一个环节。今天讨论的主题就是内存管理。
内存管理包括:内存分配,对象使用,对象挂起,对象使用,内存释放。在使用之前
我们要为其分配空间,使用中保留其空间,使用完后要释放其空间。简单的分配和释放只
是内存管理的初级阶段。当我们引入对象所有权这一概念时,内存管理的难度就变大了。
对象所有权与接下来要解释的三个名词有关。
首先,我们要解释三个名次:create,retain和copy。
create和retain都会使对象的【object count】值加1,此时拥有对象所有权,因此使用
完后必须对其释放。copy不会是对象的【object count】值加1,此时没有拥有对象所有权,
使用完后不需对其释放。
在对象定义中需要注意的点(以NSMutbaleString和NSMutableArray为例):
NSMutableArray
initWithObject: //对象的引用计数值不变
arrayWithObject: //对象的引用计数值不变
arrayWithObject: //对象的引用计数值加1
addObject: //对象的引用计数值加1
arrayWithArray: //对象的引用计数值加1,被参考的引用对象值也加1
initWithArray: //对象的引用计数值加1
initWihtArray: copyItem: //对象的引用计数值从1开始
NSMutableString
initWithFormat: //对象的引用计数值不变
initWithString: //对象的引用计数值不变
然后开始说明,在对象使用中的内存管理。
在容器中添加对象,将使对象的【object count】值加1,包括nsarray、nsdictionary。
引用的对象在使用完后需要释放,否则会导致内存泄漏。
在getter和setter方法中:
-(NSNumber *)count
{
return _count;
}
-(void)setCount:(NSNumber *)newCount
{
[newCount retain];
[_count release];.//在OC中,对象为没有初始化也可以执行这一步操作
_count = newCount;
}
-(void)reset
{
NSNumber *zero = [[NSNumber alloc] initWithInteger:0];
[self setCount:zero];
[zero release];
}
-(void)reset
{
NSNumber *zero = [NSNumber initWithInteger:0];
[self setCount:zero];
}
在类变量初始函数和析构函数(dealloc)中,不需要对类变量执行初始化操作。
-init
{
self = [super init];
if(self)
{
_count = [[NSNumber alloc] initWithInteger:0];
}
return self;
}
-initWithCount:(NSNumber *)startingCount
{
self = [super init];
if(self)
{
_count = [startingCount copy];
}
return self;
}
使用中的对象可能面临着被释放的危险,包括如下两种情况
1> heisenObject将被释放:
heisenObject = [array objectAtIndex:n];
[array removeObjectAtIndex:n];
2>
id parent = <#create a parent object#>;
heisenObject = [parent child];
[parent release];
因此防止如上情况的出现,我们可以采取如下的对策:
heisenObject = [[array objectAtIndex:n] retain];
[array removeObjectAtIndex:n];
//user heisenObject...
[heisenObject release];
最后,附上官网上关于内存管理的解说图对此次内存管理解说做个总结。希望对大家掌握内存管理有所帮助!
iphone开发--内存管理相关推荐
- iPhone开发内存管理
开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有memory leak ,杀掉 ...
- 【引用】iPhone开发内存管理
原文地址:http://www.robinlu.com/blog/archives/392 开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, mem ...
- iPhone开发内存管理之一
移动开发的特点:资源的有限性.作为手持设备,iphone的内存与传统的PC不可同日而语,这就要求我们在开发IOS程序的过程中,首要也是最重要的任务就是解决内存释放问题,本文将在网络上搜集的关于内存管理 ...
- iphone开发 内存管理
我一般喜欢在开发的最后阶段,才考虑内存管理 那么就需要好的工具,帮你定位,内存泄露的位置. 经过一段时间的研究,已经完美控制了内存的增长 1.通过查找alloc关键字,自己找出项目中需要释放的内存 2 ...
- iOS开发内存管理总结
一.retain.copy.assign的区别: 1.retain:当对一个对象A调用retain,然后赋值给B时,对象的引用计数加1,A和B指向同一个内存地址. 2.copy:当对一个对象A调用re ...
- iphone objective-c内存管理
1:retain返回一个id类型的值,通过这种方式,可以嵌套执行带有其他消息带有参数的保留调用,增加对象的保留计数器值,并要求对象执行某种操作,例如:[[car retain] setTire:ti ...
- iphone内存管理的具体问题解决方案
iPhone 开发内存管理 开发iPhone 应用程序并不难,基本上就是三个词 - "memory, memory, memory" .iPhone OS 对内存的要求很严格,有m ...
- iPhone内存管理详细解说(一)
iPhone内存管理详细解说系列转载来源:http://keywind.me/blog/2011/05/07/iphonenei-cun-guan-li-xiang-xi-jie-shuo-yi/ 感 ...
- iphone 内存管理2
iPhone 开发过程中,内存的使用至关重要.不但要合理分配使用内存,还要注意内存泄露的问题, 因为内存泄露会导致程序由于内存不足而崩溃.根据个人开发的经验来看,在开发iPhone程序的过程中,关于内 ...
最新文章
- 参数服务器训练基本理论
- 【numpy学习笔记】矩阵操作
- 以为是行废代码,原来有这作用!
- 域名解析对网站SEO优化有何影响?
- servlet 认证,授权
- Android Studio连接手机没反应,提示错误adb.exe start-server' failed -- run manually if necessary
- 深度学习和神经网络——第二周笔记
- (转) EF三种编程方式的区别Database first ,Model first ,code first
- carmaker的弱智算法
- 文献参考文献著录规则
- Linux如何整数分区,硬盘整数分区怎么计算?NTFS整数分区数值表分享
- OpenAI生成二次元美女【辣眼睛慎入】
- 冯提出的计算机工作原理是,冯诺依曼提出的计算机的基本工作原理是什么
- 安全:金融信息化的命脉
- 讲一点色相、饱和度、明度
- 在vi 中设置tab键为4个空格,并显示行号,对文件中的TAB与空格进行相互转换
- 【Linux】——在Xshell输入ssh root@公网ip进行远程连接Linux失败,显示(port 22): Connection failed的完美解决方法
- with复合结构小结
- 腾讯研发动画组件,以后动画制作用PAG
- 关于Unity5 发布到安卓后帧数低的问题