首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在两个使用自定义UIViewController的UIView之间进行转换而不会造成内存泄漏?

如何在两个使用自定义UIViewController的UIView之间进行转换而不会造成内存泄漏?
EN

Stack Overflow用户
提问于 2011-03-15 20:12:17
回答 3查看 2K关注 0票数 1

我正在尝试使用视图模拟翻书。当查看一本打开的书时,每个UIView显示两页(左和右)。翻页时,应该会显示一个新的UIView。我目前的方法是创建一个带有空白根UIView的自定义UIViewController,并使页面成为子视图。当我添加一个新的子视图时,我从上一个添加的子视图过渡到新的子视图。一旦转换完成,我想删除之前的最后一个子视图,因为它不再需要--它不再可见并占用内存。

本质上,它是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UIView * myOldPageView = [[self.view subviews] lastObject];
[self.view addSubview:myNewPageView];
// ... transition between the two views
[myOldPageView removeFromSuperview];

这是我对它的初步尝试,失败了,出现了一个神秘的崩溃,没有堆栈跟踪。此方法位于我的自定义UIViewController中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(void) switchToController:(UIViewController *) controller {
    [controller viewWillAppear:YES];        

    if (self.currentScreenController != nil) {
        [self.currentScreenController viewWillDisappear:YES];
    }

    [self.view addSubview:[controller view]];

    if (self.currentScreenController != nil) {
        [[self.currentScreenController view] removeFromSuperview];
        [self.currentScreenController viewDidDisappear:YES];
    }

    self.currentScreenController = controller;

    [controller viewDidAppear:YES];
}

在此方法调用后执行[controller release]会导致崩溃,这很奇怪,因为保留计数大于0。如果我不做释放,我会得到一个内存泄漏。

编辑这里是另一种不使用控制器的方法,当旧的页面视图从其superview中删除时会崩溃:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(void) switchToView:(UIView *) screen {
  [self.view addSubview:screen];
  [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:screen cache:NO];
  [UIView commitAnimations];
  if (3 < [[self.view subviews] count]) {
    [[[self.view subviews] objectAtIndex:0] removeFromSuperview]; // <- crash
  }
}

编辑即使我尝试在添加新的子视图后立即删除它,我也会崩溃,没有过渡动画:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 -(void) switchToView:(UIView *) screen {
   [self.view addSubview:screen];
   if (3 < [[self.view subviews] count]) {
     [screen removeFromSuperview]; // <- crash
    }
  }

编辑我现在强烈认为问题出在释放添加的视图,这意味着它与动画或视图控制器无关。

EN

回答 3

Stack Overflow用户

发布于 2011-03-15 20:25:35

您可能想看看UIView方法transitionFromView:toView:duration:options:completion:

使用options:,您可以指定页面卷曲效果。

这个方法是从fromView参数中的视图转换到toView参数中的视图的一种简单方法。默认情况下,视图层次结构中的视图被toView中的视图替换为fromView中的视图。如果这两个视图都已经是视图层次结构的一部分,则可以在options参数中包含UIViewAnimationOptionShowHideTransitionViews选项以隐藏或显示它们。

票数 3
EN

Stack Overflow用户

发布于 2011-03-15 20:16:42

尝试您想要处理的视图的removeFromSuperview。

票数 0
EN

Stack Overflow用户

发布于 2011-03-15 23:34:22

这只是文档中的内容,但现在我们开始:使用NavigationController并在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

其中添加到数组的最后一项成为导航堆栈的顶部项。从文档中:

如果启用了动画,此方法将根据items数组中的最后一项是否已在导航堆栈中来确定要执行哪种类型的转换。如果视图控制器当前在堆栈中,但不是最顶层的项,则此方法使用pop转换;如果它是最顶层的项,则不执行转换。如果视图控制器不在堆栈上,则此方法使用推式转换。只执行一次转换,但当该转换完成时,堆栈的所有内容都将替换为新的视图控制器。例如,如果控制器A、B和C在堆栈上,而您设置了控制器D、A和B,则此方法使用弹出过渡,生成的堆栈包含控制器D、A和B。

也就是说,如果你有视图控制器A和B,创建数组

{A,B} {B,A} {A} {B}。

假设你从第一页A开始,然后你想要推转到B,将数组设置为{B},请注意:

如果视图控制器不在堆栈上,则此方法使用推式过渡。

下一次,将其设置为{A},依此类推,以进行正向迭代。现在,如果您想要从B到A的pop转换,请注意

如果视图控制器当前在堆栈中,但不是最上面的项,则此方法使用pop转换;

您将其设置为{ B,A},反之亦然,从A到B。当然,在动画(?)之后,只需返回到{A}和{B}数组以返回到起始点-如果视图控制器已经是最上面的,则不执行任何转换。祝你好运;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5317437

复制
相关文章
iOS 根据UIView获取所在的UIViewController
本文将讲述在iOS开发中如何根据某个UIView来获取所属的UIViewController
赵哥窟
2018/09/13
2.5K0
iOS 根据UIView获取所在的UIViewController
Runtime运用:埋点统计
Runtime有个黑魔法,可以通过method swizzling在运行时将系统API进行替换,可以再自定义的方法中进行埋点。
Helloted
2022/06/07
8770
Runtime运用:埋点统计
C++造成内存泄漏的原因汇总
对于C++的内存泄漏,总结一句话:就是new出来的内存没有通过delete合理的释放掉!
C语言与CPP编程
2020/12/02
9230
C++造成内存泄漏的原因汇总
ThreadLocal真的会造成内存泄漏吗?
ThreadLoca在并发场景中,应用非常多。前几天有位小伙伴问我一个问题,说ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考。如果大家有其他见解可以在评论区讨论。
Tom弹架构
2022/08/22
6320
ThreadLocal真的会造成内存泄漏吗?
案例分享-libc STL 造成的疑似“内存泄漏”
我的程序根据我的计算,内存使用只需要30MB左右。但是观察发现,程序的内存不断上涨。
早起的鸟儿有虫吃
2020/10/29
2.1K0
案例分享-libc STL 造成的疑似“内存泄漏”
Java 如何在 Array 和 Set 之间进行转换
在本文章中,我们对如何在 Java 中对 Array 和 Set 进行转换进行一些说明和示例。
HoneyMoose
2023/05/10
4900
Java 如何在 Array 和 Set 之间进行转换
深入理解Java中的内存泄漏内存泄漏内存泄漏发生的原因造成内存泄露的常见情形内存泄露的解决方案
Java的一个最显著的优势是内存管理。你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现。
desperate633
2018/08/22
1.7K0
深入理解Java中的内存泄漏内存泄漏内存泄漏发生的原因造成内存泄露的常见情形内存泄露的解决方案
【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类
本文介绍了如何使用 Aspects 库实现 iOS 内的内存泄漏检测,通过结合 YFMemoryLeakDetector 工具类,可以更加快速、精准地检测出内存泄露问题,从而帮助开发人员提前发现并修复问题,提高程序的稳定性和可维护性。
ios122
2018/01/02
1.4K0
iOS开发之UIView与UIViewController的生命周期总结
iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB;创建ViewController常见的也有两种方式一个是纯代码,一个是借助于StoryBoard。 通过交流我发现很多童鞋对这些概念都很模糊,于是通过实验写一篇博客供参考。 重写View的如下方法 @implementation YFView -(instancetype)init{ self = [super init]; NSLog(@"%s", __func__); re
YungFan
2018/05/03
8230
2018 - iOS 面试题汇总一般面试题BAT面试题
金三银四,相信最近很多人都在跳槽。那么面试题自然还是要看下的,在这我就把我手里收集到的面试题(朋友面试,网上收集等等)进行了汇总,希望可以帮到正在或者准备面试的你,同时我也可以自己在过一遍一般面试题 1.堆和栈的区别 1.内存管理范围 只有oc对象需要进行内存管理 非oc对象类型比如基本数据类型不需要进行内存管理 2.内存管理本质 因为:Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,就是release OC对象存放于堆里面(堆内存要程序员手动回收) 非OC
陈雨尘
2018/06/07
6.5K0
iOS14开发-入门知识
iOS 是由苹果公司开发的移动操作系统 。苹果公司最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统(最初叫 iPhone runs OS X)。该系统最初是设计给 iPhone 使用的(所以后来曾命名为 iPhone OS),之后陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上(所以在 WWDC 2010 上最终宣布更名为 iOS)。
YungFan
2021/01/18
2.9K0
Cocoa编程中视图控制器与视图类详解
iPhone编程规则是:一个窗口,多个视图。UIView是iPhone屏幕上很多控件的基础类。每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView及其专门化子类构建的。 显示数据的视图: UITextView UILabel UIImageView UIWebView MKMapViews UIScrollView 可选择的视图(以下两个视图类实例都是模态显示的): UIAlertView UIActionSheet  所有控件(控件是将用户触摸转换为回
猿人谷
2018/01/17
5.1K0
Cocoa编程中视图控制器与视图类详解
使用windbg排查内存泄漏
  近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高,
Jlion
2022/04/07
3.7K0
使用windbg排查内存泄漏
Go常见错误集锦之切片使用不当会造成内存泄漏的那些场景
storeMessageType函数将存储最近的1000条消息的消息类型(1000个字节类型的切片)。然后测试该实现,功能正常。然后,我们将其部署到生产环境下,然而我们观察到在生产环境的大流量下会消耗很大的内存。这是为什么呢?
Go学堂
2023/01/31
1.2K1
valgrind使用:检测内存泄漏
07 Nov 2016 valgrind使用:检测内存泄漏 本文简单介绍c开发中的内存泄漏和动态内存分配函数,并使用valgrind分析c程序的内存泄漏问题。 1 什么是内存泄漏 c语言中,需由开发者负责内存的申请和释放,内存泄漏是指开发者在程序中使用动态内存分配函数xxlloc在堆(heap)上申请内存,内存在使用完毕后未使用free函数释放,那么这块内存在程序退出前都不能再次使用,导致内存使用逐渐增大,直至耗尽,程序异常退出。 xxlloc函数指mal
俊采
2018/05/15
2.5K0
IOS开发系列——UIView专题之五:常用开发技巧篇
blurView.backgroundColor= [UIColorcolorWithRed:0green:0blue:0alpha:0.3];
江中散人_Jun
2022/03/08
1.2K0
【IOS开发基础系列】UIViewController专题
        在UIViewController中,view(黑体的view指的是controller的view属性)有两个循环:加载和卸载循环。当程序的一部分向controller请求view的指针且view不在内存中时,view会进入加载循环,controller会将view加载入内存。
江中散人_Jun
2023/10/16
7790
【IOS开发基础系列】UIViewController专题
使用 Android Studio 检测内存泄漏与解决内存泄漏问题
林冠宏-指尖下的幽灵
2018/01/03
1.6K0
使用 Android Studio 检测内存泄漏与解决内存泄漏问题
Java开发,内存泄漏不会排查,这下溴大了
内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
IT大咖说
2021/07/19
9050
Java开发,内存泄漏不会排查,这下糗大了
在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC(Garbage Collection垃圾回收),这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。
架构师修炼
2021/06/25
5330
Java开发,内存泄漏不会排查,这下糗大了

相似问题

如何在UIView容器UIViewController中阻止内存泄漏

119

使用回调而不会造成泄漏

13

如何为UITableViewCell分配资源而不会造成内存泄漏

25

使用observeEvent造成的内存泄漏

116

UIViewController内存泄漏

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文