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;
}
这样内存其视图树就会跟着释放掉内存,从系统中彻底释放掉了。
分享到:
相关推荐
除了实现上述方法之外,还应该重载`dealloc`方法,以进行适当的内存释放操作。重载`dealloc`方法时,应确保释放所有自定义的对象,并将非对象引用设为nil,以避免野指针错误。 掌握这些UIView的生命周期知识,可以...
在"UIView和UIImage的转化.xcodeproj"项目中,你可以找到一个完整的实现例子,包括如何在实际项目中集成这个功能,以及可能遇到的问题和解决方案。通过这个项目,开发者可以更好地理解和掌握这个转换过程,提升iOS...
7. **内存管理**:在场景切换过程中,注意内存管理,避免内存泄漏。确保在适当的时候释放不再使用的资源。 在这个“ios”文件夹中,可能包含了实现上述交互的代码,如Objective-C或Swift的类文件,以及可能的配置...
由于iOS使用引用计数的内存管理机制,所以需要适时地释放创建的实例以避免内存泄漏。 #### 2. 通过storyboard加载 storyboard是iOS中一种非常方便的视图控制器配置方式,它允许开发者通过可视化界面设计应用的界面...
5. **消失**:当视图不再可见时,可能会发生资源释放等操作。 #### 五、高级特性 1. **自动布局(Auto Layout)**:通过设置约束(constraints)来管理视图之间的相对位置和大小,从而实现更灵活的界面布局。 2. **...
在这个方法中,我们可以释放一些系统资源,例如内存和其他系统资源。 在上面的代码中,我们可以看到LifeView类继承自UIView,并实现了相关的生命周期方法。在viewDidLoad方法中,我们实例化了LifeView对象,并将其...
循环引用是内存管理的一个常见问题,两个或多个对象相互引用,导致它们的引用计数无法降为0,从而无法释放内存。为了解决这个问题,Objective-C引入了弱引用(weak reference)和强引用(strong reference)的概念,以及...
8. NSString的内存管理:包括字符串的常量缓存池、内存计数、内存释放等问题,了解NSString的内存管理对提升性能有重要作用。 9. App架构与优化:包括选择适合的架构模式如MVC,并对其进行优化,确保应用性能和可...
本篇内容将深入探讨实例变量如何引发循环引用问题,以及如何解决这一问题,以确保内存管理的有效性。 首先,我们需要了解iOS中的内存管理机制,主要是ARC(Automatic Reference Counting,自动引用计数)。ARC会...
`autorelease`是一种让对象自动管理生命周期的方式,对象被加入到自动释放池中,当自动释放池被清空时,对象会被发送`release`消息,从而减少内存泄漏的风险。面试官可能会问到`autorelease`的具体实现机制和相关的...
此外,使用OpenFlow库时需要注意内存泄漏问题,及时释放不再使用的图片资源,以避免内存溢出。 书中还强调了UIViewController和UIView的组织管理。UIView是构成用户界面的基础,它能够响应用户的输入,并能够根据...
5. **性能监控**:通过`Instruments`工具中的`Leaks`和`Memory`工具来监控内存使用情况,及时发现并修复可能导致内存泄漏的问题。 综上所述,这个示例主要涉及`UIScrollView`、`UIButton`、`UIPageControl`的使用,...
**释放对象**:在使用完 UIView 后,应当适当地释放对象,以避免内存泄漏。 - **示例代码**: ```objective-c UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 120, 100)]; blueView....
即使外部没有其他对象引用这两个对象,由于彼此间的强引用,它们都不会被释放,从而造成内存泄漏。 6. **+load和+initialize的作用** - `+load`:当类对象首次加载到内存中时,运行时系统会调用每个类的`+load`...
### iOS面试知识点详解 #### 一、UIWindow、UIView与...5. **模拟面试**:通过模拟面试的形式来练习面试技巧和问题解答能力,提高临场表现。 通过以上知识点的学习和理解,相信能够在iOS面试中取得优异的成绩。
ARC(Automatic Reference Counting,自动引用计数)是随着iOS 5一同推出的,它有效地避免了由于忘记释放内存而导致的常见内存泄漏问题。ARC自动处理`retain`和`release`的过程,因此开发者无需手动介入。 例如,...
- **局限性**:虽然ARC可以极大减少内存泄漏的风险,但它并不能解决所有内存管理问题,例如block引起的循环引用、Core Foundation对象的不当管理等问题。 #### 2. 合理使用reuseIdentifier - **背景介绍**:在...
- Autorelease机制:在Objective-C中,对象的内存管理可以通过自动释放池来实现自动回收,减轻程序员的工作量。 2. 高级iOS开发技能: - UIView:iOS中用于视图层次结构和布局的基类,涉及到视图的位置、大小、...
确保在不使用图片时释放内存,防止内存泄漏。Swift的自动引用计数(ARC)可以帮助管理对象的生命周期,但开发者仍需关注内存的使用情况。 10. **优化** 对于性能优化,可以考虑使用内存缓存来存储已加载的图片,...
3. 注意内存管理:确保在适当的时候释放ivar所指向的对象,如在视图控制器的`- (void)dealloc`方法中。 4. 避免循环引用:当ivar与视图控制器形成强引用循环时,会导致内存泄漏。可以通过使用weak属性或使用NSProxy...