在dismissModalViewControllerAnimated:YES之后,内存仍然徘徊

如何解决在dismissModalViewControllerAnimated:YES之后,内存仍然徘徊

| 我正在介绍一个模态视图控制器,其中包含带有一堆图像的UIScrollView。当我解散模态视图控制器时,我可以在我的分配(仪器)中看到分配给图像的内存在四处徘徊,但不会引起泄漏。 给我带来一些混乱,任何帮助都会很棒。这就是我所拥有的... UIViewController-DollViewController:这是我正在展示模态的主要视图控制器。这是代码-
-(IBAction)openDollCloset {
    NSLog(@\"Open Closet\");



    [self playSound:@\"soundMenuClick\"];
    ClosetViewController *closet = [[ClosetViewController alloc] initWithNibName:@\"ClosetViewController\" bundle:nil];

    closet.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentModalViewController: closet animated: YES];

    closet.delegate = self;
    closet.addToCloset = NO;
    [closet setCurrentDoll:myDoll];
    [closet openCloset];
    [closet release];

    [self closeSubmenu];

}
我手动创建滚动视图以保存服装图像。 对象closetScroller是通过@property(非原子的,保留的)定义的UIScrollView * closetScroller;与释放dealloc。
- (void)setScrollerValues { 
    if (closetScroller == nil) 
    {
        self.closetScroller = [[UIScrollView alloc] initWithFrame:CGRectMake(0,320,400)];
        [self.closetScroller setDecelerationRate:UIScrollViewDecelerationRateFast];
        [self.closetScroller setDelegate:self];
        [self.closetScroller setPagingEnabled:YES];
        [self.closetScroller setShowsHorizontalScrollIndicator:NO];
        [self.view addSubview:closetScroller];
    }
    [self.closetScroller setContentSize:CGSizeMake(outfitCount * 320,400)];
}
创建scrollView之后,我将图像添加到滚动条中。我相信我会释放一切正确的。我正在使用NSData对象创建图像并释放它们。
- (void)addOutfitsToScroller {

        // Clear out any old images in case we just deleted an outfit
    if ([[closetScroller subviews] count] > 0) 
    {
        CATransition *fade = [CATransition animation];
        [fade setDelegate:self];
        [fade setType:kCATransitionReveal];
        [fade setSubtype:kCATransitionFromRight];
        [fade setDuration:0.40f];
        [[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
        [[closetScroller layer] addAnimation:fade forKey:@\"FadeButtons\"];
    }
        // Set the pageControl to same number of buttons
    [pageControl setNumberOfPages:outfitCount];

        // Load the outfit image and add it to the scroller
    for (int i = 0; i < outfitCount; i++) 
    {
        NSArray *savedDataArray = [[NSArray alloc] initWithArray:[closetItemsArray objectAtIndex:i]];
        UIImageView *v = [[UIImageView alloc] initWithFrame:CGRectMake(320*i,400)];
        [v setUserInteractionEnabled:NO];
        [v setAlpha:0.40f];

        NSData *imageData = [[NSData alloc] initWithContentsOfFile:[savedDataArray objectAtIndex:1]];
        UIImage *outfitImage = [[UIImage alloc] initWithData:imageData];
        UIImageView *closetImage = [[UIImageView alloc] initWithImage:outfitImage];
        [imageData release];
        [outfitImage release];
        [savedDataArray release];

        CGSize frameOffset;
        #ifdef LITE_VERSION
        frameOffset = CGSizeMake(40,60);
        #else
        frameOffset = CGSizeMake(20,10);
        #endif
        closetImage.frame = CGRectOffset(closetImage.frame,frameOffset.width,frameOffset.height);

        [v addSubview:closetImage];
        [closetImage release];

        [self.closetScroller addSubview:v];
        [v release];
    }
}
这一切都很好。然后,当用户选择“关闭”按钮或选择我称为的服装时:
[self.delegate closeClosetWindow];
该方法在parentViewController中调用委托方法,该方法只需进行以下调用:
[self dismissModalViewControllerAnimated:YES];
我也尝试过从模态视图控制器本身调用dismissModalViewControllerAnimated:YES。它只是将消息转发到它的parentViewController并关闭模式,与第一种方法相同。两者在内存方面都没有区别。 所以我要做的是使用此方法关闭视图:
[[self.closetScroller subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
[self dismissModalViewControllerAnimated:YES];
当我这样做时,我可以看到在Instruments中我的对象分配减少了。在打开壁橱视图之前,我在约1.85mb处分配了对象。当我打开壁橱时,它会增加到2.5左右,具体取决于将多少服装图像加载到UIScrollView中。然后,当我不使用上述方法关闭视图时,它停留在2.5并在下次打开时增加。虽然当使用上述方法从滚动条中删除服装图像时,我的对象分配又回落到1.85mb处。也许更多的信息告诉我它还挂在其他东西上。 还要注意,当查看对象分配时,我确实看到了创建的ClosetViewController对象,并且当我关闭模式时,它的引用被释放。我可以看到它malloc并在打开和关闭它时释放视图。它并没有保留视图对象本身。我很困惑。 不知道在这里做什么。我没有任何泄漏,并且一切正常。任何想法都很棒。 标记

解决方法

我注意到仪器中的对象分配每次打开模式窗口时都会实时引用UIScrollView。因此,为了解决问题,在分配滚动视图时,我分配了一个新的UIScrollView对象,并将其分配给closetScroller,然后释放。这解决了问题,我认为您只是没有在视图控制器的dealloc中释放closetScroller。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-