`
beike
  • 浏览: 361994 次
社区版块
存档分类
最新评论

UIView内存释放问题

 
阅读更多

UIView内存释放,之前一直以为把alloc的UIView对象,最后release掉或者removeFromSuperview掉就可以了。但是最近项目中出现了当释放父试图时,子视图的内存不释放,最后导致内存泄漏,报内存警告最后程序崩溃。

  造成UIview内存泄漏的原因是,当释放UIView时,其子视图中有占有的资源没有释放掉,如动画没有结束,最后造成内存不会释放掉。

下面的代码能够很好的展示上述过程:

在主视图上添加一个AnimationView,然后在AnimationView中在添加一个视图:

Animations *animationView=[[Animations alloc] initWithFrame:CGRectMake(10, 10, 270, 400)]; 
        [animationView setBackgroundColor:[UIColor yellowColor]]; 
        [self addSubview:animationView]; 
        [animationView release];

在Animations视图中添加一个递归的动画:


- (void)wobble { 
    NSLog(@">>>>>>>>>>>>>>>>>>"); 
        CGFloat rotation = (kWobbleRadians * M_PI * 2) / 360.0; 
        CGAffineTransform wobbleLeft = CGAffineTransformMakeRotation(rotation); 
        [UIView beginAnimations:nil context:nil]; 
        [UIView setAnimationDuration:kWobbleTime]; 
        [UIView setAnimationDelegate:self]; 
        self.transform = wobbleLeft; 
   //     if (!releaseFlage) { 
            [UIView setAnimationDidStopSelector:@selector(wobble)]; 
   //     } 
        [UIView setAnimationRepeatAutoreverses:NO]; 
        [UIView commitAnimations]; 
}

由于当前类每隔3秒钟要执行一次递归,所以当在主视图中移除AnimationView时,由于AnimationView的子视图动画是一个递归没有结束,所以当前这个视图树不会释放,只是不再界面上显示,最终造成内存泄漏。解决办法如下,当AnimationView想要移除时,需要将其子视图上的动画移除掉。我的做法是在AnimationView中添加下面方法即可:

- (void)willRemoveSubview:(UIView *)subview 

    Animations *downBookView=(Animations *)subview; 
    downBookView.releaseFlage=TRUE; 
}

这样内存其视图树就会跟着释放掉内存,从系统中彻底释放掉了。

分享到:
评论

相关推荐

    UIView的生命周期

    除了实现上述方法之外,还应该重载`dealloc`方法,以进行适当的内存释放操作。重载`dealloc`方法时,应确保释放所有自定义的对象,并将非对象引用设为nil,以避免野指针错误。 掌握这些UIView的生命周期知识,可以...

    UIView转化为ImageDemo

    在"UIView和UIImage的转化.xcodeproj"项目中,你可以找到一个完整的实现例子,包括如何在实际项目中集成这个功能,以及可能遇到的问题和解决方案。通过这个项目,开发者可以更好地理解和掌握这个转换过程,提升iOS...

    UIView和Coco2d-x场景之间的相互切换

    7. **内存管理**:在场景切换过程中,注意内存管理,避免内存泄漏。确保在适当的时候释放不再使用的资源。 在这个“ios”文件夹中,可能包含了实现上述交互的代码,如Objective-C或Swift的类文件,以及可能的配置...

    UIViewController的加载方式和UIView的加载详解

    由于iOS使用引用计数的内存管理机制,所以需要适时地释放创建的实例以避免内存泄漏。 #### 2. 通过storyboard加载 storyboard是iOS中一种非常方便的视图控制器配置方式,它允许开发者通过可视化界面设计应用的界面...

    UIView Class Reference

    5. **消失**:当视图不再可见时,可能会发生资源释放等操作。 #### 五、高级特性 1. **自动布局(Auto Layout)**:通过设置约束(constraints)来管理视图之间的相对位置和大小,从而实现更灵活的界面布局。 2. **...

    IOS UIView的生命周期的实例详解

    在这个方法中,我们可以释放一些系统资源,例如内存和其他系统资源。 在上面的代码中,我们可以看到LifeView类继承自UIView,并实现了相关的生命周期方法。在viewDidLoad方法中,我们实例化了LifeView对象,并将其...

    iPhone 应用开发中Object-C 内存管理--千锋培训

    循环引用是内存管理的一个常见问题,两个或多个对象相互引用,导致它们的引用计数无法降为0,从而无法释放内存。为了解决这个问题,Objective-C引入了弱引用(weak reference)和强引用(strong reference)的概念,以及...

    过往大公司iOS面试总结

    8. NSString的内存管理:包括字符串的常量缓存池、内存计数、内存释放等问题,了解NSString的内存管理对提升性能有重要作用。 9. App架构与优化:包括选择适合的架构模式如MVC,并对其进行优化,确保应用性能和可...

    InstanceVar

    本篇内容将深入探讨实例变量如何引发循环引用问题,以及如何解决这一问题,以确保内存管理的有效性。 首先,我们需要了解iOS中的内存管理机制,主要是ARC(Automatic Reference Counting,自动引用计数)。ARC会...

    iOS面试题之道 2018总结(上)

    `autorelease`是一种让对象自动管理生命周期的方式,对象被加入到自动释放池中,当自动释放池被清空时,对象会被发送`release`消息,从而减少内存泄漏的风险。面试官可能会问到`autorelease`的具体实现机制和相关的...

    iPhone开发揭秘.pdf

    此外,使用OpenFlow库时需要注意内存泄漏问题,及时释放不再使用的图片资源,以避免内存溢出。 书中还强调了UIViewController和UIView的组织管理。UIView是构成用户界面的基础,它能够响应用户的输入,并能够根据...

    多频首页(1) uiscrollview 降低消耗内存 的例子

    5. **性能监控**:通过`Instruments`工具中的`Leaks`和`Memory`工具来监控内存使用情况,及时发现并修复可能导致内存泄漏的问题。 综上所述,这个示例主要涉及`UIScrollView`、`UIButton`、`UIPageControl`的使用,...

    UI课件第一讲

    **释放对象**:在使用完 UIView 后,应当适当地释放对象,以避免内存泄漏。 - **示例代码**: ```objective-c UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 120, 100)]; blueView....

    关于一些 iOS 面试问题的解答1

    即使外部没有其他对象引用这两个对象,由于彼此间的强引用,它们都不会被释放,从而造成内存泄漏。 6. **+load和+initialize的作用** - `+load`:当类对象首次加载到内存中时,运行时系统会调用每个类的`+load`...

    iOS 面试从简单到复杂

    ### iOS面试知识点详解 #### 一、UIWindow、UIView与...5. **模拟面试**:通过模拟面试的形式来练习面试技巧和问题解答能力,提高临场表现。 通过以上知识点的学习和理解,相信能够在iOS面试中取得优异的成绩。

    性能优化的25个建议和技巧

    ARC(Automatic Reference Counting,自动引用计数)是随着iOS 5一同推出的,它有效地避免了由于忘记释放内存而导致的常见内存泄漏问题。ARC自动处理`retain`和`release`的过程,因此开发者无需手动介入。 例如,...

    25条iOS代码编写技巧与建议

    - **局限性**:虽然ARC可以极大减少内存泄漏的风险,但它并不能解决所有内存管理问题,例如block引起的循环引用、Core Foundation对象的不当管理等问题。 #### 2. 合理使用reuseIdentifier - **背景介绍**:在...

    收集百度、阿里等100家企业面试题合集下.pdf

    - Autorelease机制:在Objective-C中,对象的内存管理可以通过自动释放池来实现自动回收,减轻程序员的工作量。 2. 高级iOS开发技能: - UIView:iOS中用于视图层次结构和布局的基类,涉及到视图的位置、大小、...

    swift-BannerView能自动滚动的简单横幅视图

    确保在不使用图片时释放内存,防止内存泄漏。Swift的自动引用计数(ARC)可以帮助管理对象的生命周期,但开发者仍需关注内存的使用情况。 10. **优化** 对于性能优化,可以考虑使用内存缓存来存储已加载的图片,...

    ios 导航栏放置多个按钮及引申的ivar变量的问题

    3. 注意内存管理:确保在适当的时候释放ivar所指向的对象,如在视图控制器的`- (void)dealloc`方法中。 4. 避免循环引用:当ivar与视图控制器形成强引用循环时,会导致内存泄漏。可以通过使用weak属性或使用NSProxy...

Global site tag (gtag.js) - Google Analytics