objective c arc机制-C 的 ARC 有什么缺点,是否能完全避免内存泄露

今天看啥 热点:
IOS的ARC会导致的内存泄露问题和解决方案iOS提供了ARC功能,很大程度上简化了内存管理的代码。但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。下面列举两种ARC导致内存泄露的情况。1,循环参照A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。这种问题常发生于把delegate声明为strong属性了。例,@interface SampleViewController@property (nonatomic, strong) SampleClass *sampleC@end@interface SampleClass@property (nonatomic, strong) SampleViewController *@end&上例中,解决办法是把SampleClass 的delegate属性的strong改为assing即可。&2,死循环如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。这种问题常发生于animation处理。例,比如,CATransition *transition = [CATransition animation];transition.duration = 0.5;tansition.repeatCount = HUGE_VALL;[self.view.layer addAnimation:transition forKey:&myAnimation&];&上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。解决办法是,在ViewController关掉的时候,停止这个animation。-(void)viewWillDisappear:(BOOL)animated {&&& [self.view.layer removeAllAnimations];}&内存泄露的情况当然不止以上两种。即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。arc的程序出现内存泄露怎办实例一:用arc和非arc混编,非arc的类在arc里实例化并且使用,在arc里居然出现内存泄露,而且应为是arc,所以无法使用release,autorelease和dealloc去管理内存。正常情况下应该是不会出现这种情况的,某一个类若是ARC,则在这个类里面都应该遵循ARC的用法,而无需关心用到的类是否是ARC的,同样,在非ARC类里面,就需要遵循内存管理原则。用ARC,只是编译器帮你管理了何时去release,retain,不用ARC就需要你自己去管理,说到底只是谁去管理的问题,所以你再好好看看,可能问题与ARC无关。如果实在找不到问题,建议你找到泄露的那个对象,将其赋值为nil,因为ARC里面,一旦对象没有指针指向,就会马上被释放。&实例二:最近在学objective-c,我发现创建项目时如果使用了ARC,非常容易内存泄露,经常某个对象已经被释放掉了我还在使用,由于不太了解这个机制,现在我举出两个例子,请经验者帮我分析一下。例子一:一开始,在AppDelegate.m的那个开始方法中时这样写的:-&(BOOL)application:(UIApplication&*)application&didFinishLaunchingWithOptions:(NSDictionary&*)launchOptions
&&&&self.window&=&[[UIWindow&alloc]&initWithFrame:[[UIScreen&mainScreen]&bounds]];&&&&
&&&&//&Override&point&for&customization&after&application&launch.
&&&&self.window.backgroundColor&=&[UIColor&whiteColor];
&&&&UITabBarController&&tabBarController&=&[[UITabBarController&alloc]&init];
&&&&[tabBarController&setViewControllers:[self&showConnectViewOnWindow]];
&&&&[tabBarController&setDelegate:self];
&&&&[[self&window]&addSubview:&[tabBarController&view]];
&&&&[self.window&makeKeyAndVisible];
&&&&return&YES;
}然后,我还做了其他的工作:tabBarController中有tabBarItem,点击会调用一个方法但是每次一点击,就会报unrecognized&selector&send&to&instance的错误,后来上网一查,说是要把tabBarController定义成全局变量,不然这个方法一结束,tabBarController就被释放掉了,这样点击产生时间的对象都没了,于是我把它定义成全局变量,确实可以了,但我的疑问是,为什么方法一结束他就会释放掉吗,[[self&window]&addSubview:&[tabBarController&view]];我这一句不是已经在self&window里引用它了吗,他怎么还会被释放,我觉得java和C#里面这种情况是不会释放掉了。例子二:在viewdidload方法里面:
&&&&[self.navigationItem&setTitle:Title];
&&&&leftButton&=&[[UIBarButtonItem&alloc]&initWithTitle:Cancel&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&style:UIBarButtonItemStyleBordered&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&target:self&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&action:@selector(CancleButtonClicked)];
&&&&self.navigationItem.leftBarButtonItem&=&leftB这里我给屏幕上方那个导航条加了一个左边的按钮,然后点击这个按钮后会用方法CancleButtonClicked来响应,但是我运行起来一点击,还是报unrecognized&selector&send&to&instances错误了,这里又是哪个对象释放了,leftButton吗?但是self.navigationItem.leftBarButtonItem&=&leftButton已经引用了啊。解决方法:例子一[[self&window]&addSubview:&[tabBarController&view]];你只引用了tabBarController的view,没有引用tabBarController例子二,不知道什么原因,看看有没有拼写错误吧。另外,我感觉局部变量的内存一般只在它的生命周期内有效。出了它所定义的区域,即使不释放,也最好不要用了。
暂无相关文章
相关搜索:
相关阅读:
解决方案最近更新Objective-C内存管理-爱编程
Objective-C内存管理
Objective-C内存管理的三种方式:
1)自动垃圾收集(Automatic Garbage Collection);
2)手动引用计数器(Manual Reference Counting)和自动释放池;
3)自动引用计数器(Automatic Reference Counting)。
1、自动垃圾收集
&&&&在OC2.0中,有一种自动垃圾收集的内存管理形式,通过垃圾自动收集,系统能够自动检测出对象是否拥有其他的对象,当程序运行期间,不被引用的对象就会自动释放。说明:在iOS运行环境中不支持自动垃圾收集,在OS X环境才支持,但是Apple现在不建议使用该方法,而是推荐使用ARC进行替代。
2、手动引用计数器(Manual Reference Counting)和自动释放池
&&&&顾名思义,引用计数器即一个对象被引用(使用)的次数,每个对象的引用计数器占用4个字节。
&&&&影响对象RC值得方法有以下几种:
1)new、alloc、copy、mutableCopy,这几种方法用来创建一个新的对象并且获得对象的所有权,此时RC的值默认为RC=1;
2)retain,对象调用retain方法,该对象的RC+1;
3)release,对象调用 release方法,该对象的RC-1;
4)dealloc,dealloc方法并不会影响RC的值,但是当RC的值为0时,系统会调用dealloc方法来销毁对象。
&&&&关于关于在MRC中@property关键字如下:
1)assign 和 retain 和 copy
这几个关键字用于setter方法的内存管理,如果使用assign(一般用于非OC对象),那么将直接执行赋值操作;如果使用retain(一般用于OC对象),那么将retain新值,release旧值;如果使用copy,那么将release旧值,copy新值。不显示使用assign为默认值。
2)nonatomic 和 atomic
这两个关键字用于多线程管理,nonatomic的性能高,atomic的性能低。不显示使用atomic为默认值。
3)readwrite 和 readonly&
这两个关键字用于说明是否生成setter方法,readwrite将自动生成setter和getter方法,readonly 只生成getter方法。不显示使用readwrite为默认值。
4)getter 和 setter
这两个关键字用于给设值和取值方法另外起一个名字。例如@property(getter=a,setter=b:)相当于取值方法名为a,设值方法名为b:。
&&&&对于两个类A包含B,B包含A的循环引用情况下,只需要在Book1和Book2的@property属性声明中一端使用retain,一端使用assign;或使用@class。
Autorelease Pool的使用注意点:
1)release方法不能多次调用,该调用的时候调用,否则容易造成野指针错误。
2)创建对象时多次调用autorelease方法,容易造成野指针错误。
3)在自动释放池中新创建的对象并不是一定会添加到释放池中,例如由new、alloc、copy、mutableCopy创建的对象并不会加到自动释放池中,并且必须手动调用release方法才能释放对象。如果想让新创建的对象加入到自动释放池中,就必须调用autorelease方法。
4)使用autorelease方法并不会使引用计数器的值增加,只是表示将该对象加入到自动释放池中。
3、自动引用计数器(ARC)
&&&&ARC将由编译器来自动完成对象引用计数器的控制,不需要手动完成。&&&&ARC模式下,创建的新对象通常由以下几种关键字来限定:
__strong(默认值),由__strong修饰的为强指针,对象只要有强指针指向就不会被销毁;每当一个强指针指向一个对象,该对象的的RC+1;
__weak,由__weak修饰的为弱指针,弱指针所指向的对象并不会改变RC值,弱指针只表示是对对象的引用;当弱指针所指向的对象销毁时,该弱指针的值变为nil;
__unsafe_unretained,__unsafe_unretained修饰的对象指针所指向的对象也不会改变RC值,也只表示是对对象的引用;当所指向的对象销毁时,该指针的值不会变为nil,仍是保留原有的地址;
&&&&在ARC模式下,MRC中的retain、release等方法变的不可用,因为ARC是不需要我们手动管理内存的,一切由编译器完成。
&&&&在ARC模式下,@property属性关于内存管理的修饰符为strong和weak(MRC下的retain和assign不可用),表示声明为强指针还是弱指针。通常情况下都是使用strong来修饰,但是在循环引用却不是。
&&&&在相互引用的两个类中,为了避免循环引用,一般一端使用strong修饰,一端使用weak修饰。如果都使用strong修饰,那么将造成对象的循环保持,造成内存泄露。
1)ARC模式下仍能使用自动释放池;
2)MRC下的retain、release、retainCount、autorelease等方法不可使用。
3)注意循环引用下strong和weak的选择。
附:常见内存管理问题
&1.什么是ios内存管理?
& &就是在对象不再被使用的时候,把它即时的从内存中清除掉
&2.为什么要使用内存管理?
& &1.严格的内存管理,能够使我们的应用程在性能上有很大的提高
& &2.如果忽略内存管理,可能导致应用占用内存过高,导致程序崩溃
&3.系统判断一个对象是否要被销毁的依据是什么?
& &每个对象创建出来的时候,都有一个retainCount属性,默认值是1,当retainCount = 0的时候,系统就会将该对像销毁
&4.如何使对象的retainCount 值增加?
& &调用retain 对象方法
&5.如何使对象的retainCount 值减少?
& &调用release 对象方法
&6.如何判断对象已经被销毁了?
& &1.重写NSObject提供的dealloc方法,当对象即将被销毁的时候,默认会调用该方法
& &2.dealloc方法中一定要调用[super dealloc]方法
&7.内存管理原则是什么?
& &谁申请,谁释放;
& &只要是出现new,alloc,retain,就要配对出现release操作,或者autorelease操作
&**单个对象内存管理 问题
&1.什么是野指针?
& &对象的retainCount已经为0,保存了对象指针地址的变量就是野指针
& 1.1 使用野指针会有什么问题?
& & & 使用野指针调用对象的方法,会导致野指针异常,导致程序直接崩溃
&2.什么是僵尸对象?
& &retainCount = 0的对象被称之为僵尸对象,也就是不能够在访问的对象
& &2.1是什么问题导致,访问僵尸对象,时而正确时而错误?
& &2.2如何开始xcode的时时检测僵尸对象功能?
&3.如何防止出现野指针操作?
& &通常在调用完release 方法后,会把保存了对象指针地址的变量清空,赋值为nil
& &在oc中没有空指针异常,所以使用[nil retain]调用方法不会导致异常的发生
&4.什么是内存泄漏?
& &已经不在使用的对象,没有正确的释放掉,一直驻留在内存中,我们就说是内存泄漏
&5.内存泄漏有几种情况?
& & 1.没有配对释放,不符合内存管理原则
& & 2.对象提前赋值为nil或者清空,导致release方法没有起作用
&6.当对象的retainCount = 0 时 能否调用 retain方法使对象复活?
& &已经被释放的对象是无法在复活的
&7.关于内存我们主要研究的问题是什么?
& &1.野指针
& &2.内存泄露
**多个对象内存管理 问题
&1.对象与对象之间存在几种关系?
& &1.继承关系
& &2.组合关系
& &3.对象作为方法参数传递
&2.对象的组合关系中,如何确保作为成员变量的对象,不会被提前释放?
& &重写set方法,在set方法中,retain该对像,使其retainCount值增加 1
&3.组合关系导致内存泄漏的原因是什么?
& &在set方法中,retain了该对象,但是并没有配对释放
&4.作为成员变量的对象,应该在那里配对释放?
& &在dealloc函数中释放
** set方法内存管理 问题
&1.在对象的组合关系中,导致内存泄漏有几种情况?
& &1.set方法中没有retain对象
& &2.没有release掉旧的对象
& &3.没有判断向set方法中传入的是否是同一个对象
&2.该如何正确的重写set方法?
& &1.先判断是否是同一个对象
& &2.release一次旧的对象
& &3.retain新的对象
**内存管理@property参数 问题
&1.@property参数分为几类?
& 1.与set方法内存管理相关的参数
& 2.是否要生成set方法相关
& 3.多线程相关
& 4.set和get方法的名称相关
&2.@property参数那些适用于对象类型,那些适用于基本数据类型
&3.如何使用@property生成符合内存管理的set方法?
&4.@property retain参数能否用于基本数据类型?
**手动内存管理类的循环引用 问题
&1.什么情况下会出现类的循环应用?
&2.@class关键子的作用?
&3.手动内存管理如何解决类的循环引用问题?
&4.在.h文件中使用@class关键字声明一个类后,在.m文件中是否能够直接掉用该对象的方法?
**自动释放池 问题
1.什么是自动释放池?
& 自动释放池是用来存储多个对象类型的指针变量
2.自动释放池对池内对象的作用?
& 被存入到自动释放池内的对象,当自动释放池被销毁时,会对池内的对象全部做一次release操作
3.对象如何放入到自动释放池中?
&当你确定要将对象放入到池中的时候,只需要调用对象的 autorelease 对象方法就可以把对象放入到自动释放池中
4.如何创建自动释放池?
对象在自动释放池内部调用autorelease 方法
5.自动释放池能否嵌套使用?
6.自动释放池何时被销毁?
在autorelease } 执行完后
7.多次调用对象的autorelease方法会导致什么问题?
多次将地址存到自动释放池中,导致野指针异常
8.自动释放池作用
将对象与自动释放池建立关系,池子内调用autorelease 方法,在自动释放池销毁时销毁对象,延迟release销毁时间
**自动释放池应用 问题
&1.实际开发中一般如何使用autorlease
就是在方法中创建新的对象并且需要返回的时候
快速创建一个类方法
**ARC机制 问题
&1.什么是ARC机制
& &自动引用计数,不需要程序员关心,对象的retain,与release操作
&2.什么是强指针(strong),弱指针(weak)
默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。
不过, 有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类 就是这么干的),使用 __weak 关键字。NSHashTable 就是一个例子。当被引用的对象消失时,弱引用会自动设置为 nil。
& & 1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;
& & 2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针
&3.ARC机制中,系统判断对象是否被销毁的依据是什么?
指向对象的强指针是否被销毁
&4.ARC机制中,如何观察对象被销毁了?
&5.ARC机制中为什么还有autoreleasepool?
ARC 并不是舍弃了 @autoreleasepool,而是在编译阶段帮你插入必要的 retain/release/autorelease 的代码调用。
所以,跟你想象的不一样,ARC 之下依然是延时释放的,依然是依赖于 NSAutoreleasePool,跟非 ARC 模式下手动调用那些函数本质上毫无差别,只是编译器来做会保证引用计数的正确性。
&6.ARC机制的本质是什么?
对releaseCount的计算,创建对象 +1, 清空指针 -1,或者越到autoreleasepool的大括号 -1
7.ARC的目的
是让程序员不在关心对象的retainCount
**ARC机制 @property参数 问题
&1.ARC机制中如何让@property生成符合内存管理的set方法
&2.@property weak参数能否用于基本数据类型?
&3.为什么在ARC机制中,不建议使用assign类表示对象的直接赋值
4.ARC机制中不建议使用retain,assign ,容易造成混淆
(1)strong还是weak
& & 说到底就是一个归属权的问题。小心出现循环引用导致内存无法释放,或者需要引用的对象过早被释放。大体上:IBOutlet可以为weak,NSString为copy或strong,Delegate一般为weak,基础类型用assign,不过要注意具体使用情况。
(2)outlet使用strong还是weak
& & 官方文档建议一般outlet属性都推荐使用weak,不是直接作为main view里面一个subview直接显示出来,而是需要通过实例化创建出来的view,应该使用 strong(自己创建的自己当然要保持引用了)。但是要注意使用 weak时不要丢失对象的所有权,否则应该使用strong。
(3)delegate使用strong还是weak
& & delegate主要涉及到互相引用和crash(引用被释放)问题,为了防止这两个问题发生,delegate一般使用weak。
**手动内存管理代码转换成ARC代码 问题
&1.如何使用xcode自带的功能,将手动内存管理代码转换成ARC机制代码
&手动内存管理与ARC机制代码共存 问题&
&1.为什么会出现手动内存管理与ARC机制代码共存现象?
&2.为什么不统一的将代码都转换成ARC机制?
&3.如何才能够让手动内存管理的代码与ARC机制的代码共存?
**ARC机制中类的相互引用 问题
&1.ARC机制中类的相互引用,与手动内存管理类的相互引用有什么区别吗?
&2.如何解决ARC机制下类的相互引用问题?
在.h文件中使用@class关键字声明一个类,两端不能都用强指针
一端用strong,一端用weak
不要直接调用dealloc,我们知道dealloc中一般处理对象的释放,该方法的调用一般是由系统在类销毁时或内存不足时调用。因为系统知道类何时被销毁。如果手动释放,该类可能被其它类引用,这时在尝试访问时就成造成系统崩溃。
版权所有 爱编程 (C) Copyright 2012. . All Rights Reserved.
闽ICP备号-3
微信扫一扫关注爱编程,每天为您推送一篇经典技术文章。虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。
这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用。
本文假设你已经比较熟悉Obj-C的内存管理机制。
实验的开发环境:XCode 4.5.2
1、运行Demo。
先下载一个实现准备好的内存泄露的Demo吧:
下载下来,打开运行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。崩溃截图:
在崩溃的地方断住了,知道crash的地方了,但是不知道具体crash的原因。
2、设置NSZombieEnabled
这是一个 “EXC_BAD_ACCESS”错误。我们打开XCode的选项:“NSZombieEnabled” 。在crash时可能会给你更多的一些提示信息。
设置步骤:1
2:勾上红色框里的
运行,按刚才的操作选中其中的cell。再次crash,这次在output窗口会看到多了一项错误信息:
13:22:08.911 PropMemFun[] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x713ebc0
大概意思是:向已释放的内存发送消息。也就是说使用了已释放的内存,在C语言相当于使用了“野指针”
看了下crash的这个语句,sushiString应该是没问题的,它是从stringWithFormat初始化出来的。那就是_lastSushiSelected的问题。
_lastSushiSelected指向了sushiString,sushiString是一个autorelease变量。 在第二次点击时,使用的是sushiString已经被释放,所以crash了。那为_lastSushiSelected保留一下,就可以用了。代码修改如下:
&span style=&font-size:14&&
_lastSushiSelected = [sushiString retain];
运行,这时候不崩溃。
3、分析内存泄露(shift+command+b)
app不crash了,那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露
分析之后可以看到:
这里提示alertView没被释放,有内存泄露,那我们释放
[alertView release];
再分析,这个问题解决了。
4、使用Instruments的leaks工具
分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。
按上面操作,build成功后跳出Instruments工具,选择Leaks选项,这时候寿司程序也运行起来了,选中list中的项,拖动等操作后,工具显示效果如下:
大家可能都能猜到,红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢?
先在工具栏按下红色的圆形按钮,把工具监视内存的活动停下来。选择Leak,然后点中间十字交叉那,选择Call Tree.
这时候左下角的Call Tree的可选项可以选了。选中Invert Call Tree 和Hide System Libraries,显示如下:
这时候内存泄露的具体代码找到了,在右边的红色框框里指定了哪个方法出现了内存泄露。
你只要在这些方法上双击,就会跳转到具体的代码,哈哈,是不是很方便。
这里应该是提示100%内存会泄露。
相关 [ios instruments 内存] 推荐:
- ITeye博客
虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用. 本文假设你已经比较熟悉Obj-C的内存管理机制. 实验的开发环境:XCode 4.5.2.
- SegmentFault 最新的文章
你的 iOS 应用,运行速度靠谱吗. 中枪的同学莫要愁,性能优化咱有妙招. 用 Xcode 自家的调试工具 Instruments,揪出那些堵线程、占内存、耗资源的问题代码,彻底破掉迷局,让应用扬眉吐气. 对于每位 iOS 开发者来说,代码性能是个避不开的话题. 随着项目的扩大和功能的增多,没经过认真调试和优化的代码,要么任性地卡顿运行,要么低调地崩溃了之……结果呢,大家用着不高兴,开发者也不开心.
- CSDN博客移动开发推荐文章
(1)UIView本身占用的内存并不是很大,但是使用这个方法(tempImage过大会占用很高的内存). setBackgroundColor:[UIColor colorWithPatternImage:tempImage],这个怎么解决呢. 推荐使用UIImageView,然后再setImage这个方法,这样内存基本不会增长.
- 极客521 | 极客521
虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在. 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用. 本文假设你已经比较熟悉Obj-C的内存管理机制. 实验的开发环境:XCode 4.5.2.
- 移动开发 - ITeye博客
新款Objective-C内存泄漏自动检测工具PLeakSniffer,
GitHub地址. 前些天读到WeRead团队分享的一款内存泄漏检测工具
MLeaksFinder,恍惚想起早些时候自己也有过编写这样一个小工具的想法,不知道由于什么原因把这事给忘记了. 在仔细读过MLeaksFinder源码,了解实现思路之后,发现和自己最初的想法并不相同,终于在上个周末战胜拖延症将之前的想法付诸于代码,也就诞生了这款功能类似的内存泄漏检测工具PLeakSniffer.
- 移动开发 - ITeye博客
Instruments是动态分析工具,它与Xcode集成在一起,可以在Xcode中通过菜单Product→Profile启动. 启动如图所示,Instruments有很多跟踪模板可以动态分析和跟踪内存、CPU和文件系统. 每个跟踪模板都有不同的用途,其中Leaks可以检测内存泄漏点,Allocations跟踪模板可以查看内存的使用情况.
- InfoQ cn
针对iOS的MonoTouch目前支持了分代式垃圾回收器(generational garbage collector)SGen. 直到不久之前,Sgen还只是完整版本Mono中的一个实验性部分. 伴随着垃圾回收器一同到来的,还有一个为iOS准备的内存分析器(Memory Profiler),它可以从MonoDevelop集成开发环境中访问到.
- ITeye博客
内存泄漏(Memory Leaks)是当一个对象或变量在使用完成后没有释放掉,这个对象一直占有着这块内存,直到应用停止. 如果这种对象过多内存就会耗尽,其它的应用就无法运行. 这个问题在C++、C和Objective-C的MRR中是比较普遍的问题. 在Objective-C中释放对象的内存是发送release和autorelease消息,它们都是可以将引用计数减1,当为引用计数为0时候,release消息会使对象立刻释放,autorelease消息会使对象放入内存释放池中延迟释放.
- 操作系统 - ITeye博客
iOS App的性能关注点. 虽然iPhone的机能越来越好,但是app的功能也越来越复杂,性能从来都是移动开发的核心关注点之一. 我们说一个app性能好,不是简单指感觉运行速度快,而应该是指应用启动快速、UI反馈响应及时、列表滚动操作流畅、内存使用合理,当然更不能随随便便Crash啦. 工程师开发应用时除了在设计上要避免性能“坑”的出现,在实际遇到“坑”时也要能很快定位原因所在.
- littlepush - Solidot
Ars Technica的评测认为iOS 5值得升级,当然它也不可避免的存在一些小问题,给用户增添些烦恼. 用户在升级前最好手动备份一下iDevice,确保所有的应用都能转移.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。

我要回帖

更多关于 怎么避免内存泄露 的文章

 

随机推荐