`
lizhuang
  • 浏览: 904070 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ARC会导致的内存泄露

 
阅读更多
iOS提供了ARC功能,很大程度上简化了内存管理的代码。
但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。
下面列举两种内存泄露的情况。
1,循环参照
A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。
这种问题常发生于把delegate声明为strong属性了。
例,
@interface SampleViewController
@property (nonatomic, strong) SampleClass *sampleClass;
@end

@interface SampleClass
@property (nonatomic, strong) SampleViewController *delegate;
@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的内存管理机制,这样才能有效避免内存泄露。
分享到:
评论

相关推荐

    深入 Swift 的自动引用计数(ARC):内存管理的高效策略

    Swift 语言的自动引用计数(Automatic Reference Counting,简称 ARC)是一种先进的内存管理技术,用于在编译时自动插入引用计数代码,以确保应用程序不会消耗过多内存或导致内存泄漏。本文将详细探讨 ARC 的工作...

    iOS内存泄漏检测器

    内存泄漏会导致应用程序性能下降,甚至崩溃,因此,及时检测并修复内存泄漏至关重要。"iOS内存泄漏检测器"是一个实用工具,利用运行时机制帮助开发者在开发阶段就能检测出NSObject及其子类中的循环引用和其他内存...

    ios内存泄漏检测工具

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能不会立即引起问题,但随着时间的推移,累积的内存泄漏可能会导致应用程序占用的内存持续增长,直至耗尽系统资源,引发应用崩溃。...

    Leaks内存泄露检测

    3. 在运行过程中,Instruments会实时监测内存分配和释放情况,如果发现内存泄露,会在右侧的时间线上显示,并标出泄漏的具体位置。 在检测到内存泄露后,你需要根据线索分析问题所在。通常,Leaks工具会给出内存...

    block的循环引用导致的内存泄露的示例及解决办法

    然而,如果不正确地使用Block,可能会导致循环引用(retain cycle),进而引发内存泄露。本文将深入探讨Block引起的循环引用问题,提供示例并分享解决方案。 一、什么是循环引用? 循环引用是指两个或多个对象互相...

    iOS内存泄漏调试工程

    然而,如果存在循环引用或者意外的强引用,就会导致内存泄漏。 2. **循环引用**: 循环引用发生在两个或更多对象相互持有对方的强引用,使得它们无法被释放。解决循环引用的一个常见方法是使用弱引用(__weak)或...

    《Delphi Classic编译器和ARC编译器的内存管理》的代码示例图书目录及源代码.zip

    这极大地减轻了程序员管理内存的压力,但也需要注意一些潜在的问题,如循环引用可能导致的内存泄漏。 4. 源代码分析: 书中提供的源代码示例可能包括了不同类型的内存管理场景,如对象的创建、使用、传递以及在多...

    Swift-MLeaksFinder腾讯开源的iOS平台的自动内存泄漏检测工具

    当检测到内存泄漏时,MLeaksFinder会生成详细的泄漏报告,包括泄漏对象的信息、泄漏发生的位置以及可能导致泄漏的代码路径。这有助于开发者快速定位问题并修复。 6. **内存泄漏常见原因与解决策略** - 循环引用:...

    ios_调试内存泄漏

    内存泄漏是iOS开发中的一个常见问题,它会导致应用的可用内存逐渐减少,最终可能导致应用崩溃或系统资源耗尽。为了有效地识别和解决内存泄漏问题,iOS开发者可以利用Xcode自带的工具进行分析和调试。以下是两种查看...

    cordova扫码插件phonegap-plugin-barcodescanner,修复了在ios10上面的内存泄漏导致的闪退bug

    3. **Block中捕获的对象**:Block会复制其所在上下文中引用的对象,若未妥善处理,可能导致内存泄漏。 4. **非ARC库**:如果插件中包含非ARC代码,需要手动管理内存,可能会遗漏释放。 修复过程中,开发者可能通过...

    ARC完全学习指南

    尽管ARC会自动管理大部分内存,但在某些情况下,比如在异步操作或者某些特殊框架中,仍然需要使用AutoreleasePool来管理临时对象的生命周期。 12. ARC与Auto Release Pool的关系: 开发者可以使用ARC来管理...

    iOS高级内存管理ARC模式手动模式英文文档含示例工程

    "crash调试"这部分可能涉及如何识别和解决由于内存问题导致的应用崩溃,这通常需要用到Xcode的调试工具,如Instruments,来分析内存分配和泄漏。 "反汇编"是另一个关键标签,它意味着这份资料可能深入到代码的底层...

    iOS 5 ARC完全指南

    例如,在block中,如果不小心使用了强引用,可能会导致循环引用,进而引起内存泄漏。 ### AutoreleasePool与ARC AutoreleasePool机制在ARC中仍然发挥作用,但使用方式有所变化。在ARC环境下, autoreleasepool语句...

    在非ARC环境下的内存管理

    在非ARC环境下,正确使用`autorelease`是防止内存泄漏的关键。例如,假设你在方法中创建了一个新的对象: ```objc - (void)createAndUseObject { NSObject *localObject = [[NSObject alloc] init]; // 使用local...

    Swift 自动引用计数(ARC).pdf

    - **减少内存泄露**:由于ARC会自动释放不再使用的对象,因此大大降低了因忘记释放内存而导致的内存泄漏问题。 - **提高代码可读性**:开发者无需关心何时何地调用释放方法,这使得代码更加简洁、易读。 - **提高...

    如何在xcode里面使用内存泄露查找工具

    由于内存泄露和不当管理通常会导致应用程序性能下降,甚至崩溃,因此Xcode提供了内存泄露查找工具来帮助开发者发现和解决这类问题。本文将详细讲解如何在Xcode中使用内存泄露查找工具,比如Memory Leaks和...

    ARC完全指南ios

    使用`weak`属性可以确保当代理对象被释放时,其引用也会自动置为`nil`,从而避免了内存泄露。 #### `unsafe_unretained` `unsafe_unretained`是一种弱引用类型,类似于`weak`,但不同之处在于`unsafe_unretained`...

    iOS 5 arc 指南

    - **Block与ARC**:在使用Block时需要注意,Block可能会捕获Strong引用,导致循环强引用。为了处理这种情况,通常需要使用Weak指针来避免。 - **Singleton与ARC**:在ARC环境下处理Singleton模式时需要注意,应使用...

    ARC到底帮我们做了哪些工作?(v1.3)

    - **强引用循环**:当两个或多个对象互相强引用时,它们的引用计数都不会降为0,这可能导致内存泄漏。使用弱引用可以打破这种循环。 ### 3. `__strong`、`__weak`、`__unsafe_unretained`修饰符 - **`__strong`**:...

    ARC详解.pdf

    例如,当代码中创建了一个对象,ARC会自动在对象不再被使用时插入release方法,防止内存泄漏。同样,当对象被复制或需要持续存在时,ARC会插入retain方法来增加对象的引用计数。使用ARC,开发者可以专注于业务逻辑的...

Global site tag (gtag.js) - Google Analytics