iOS UIImagePickerController 和 UIWebView 导致内存问题;呈现这些视图时如何保留我的应用程序的状态?

Posted

技术标签:

【中文标题】iOS UIImagePickerController 和 UIWebView 导致内存问题;呈现这些视图时如何保留我的应用程序的状态?【英文标题】:iOS UIImagePickerController and UIWebView cause memory issues; how do I retain my app's state when presenting these views? 【发布时间】:2011-12-31 15:49:29 【问题描述】:

我有在我的应用程序中使用 UIImagePickerController 和 UIWebView 的实例,将它们呈现为来自应用程序根控制器的模态视图控制器。但是,大部分时间,这些会导致内存警告,然后导致我的“正常”视图(应用程序的当前 UI)被释放,然后在模式视图完成时重新分配。结果是,例如,用户将选择“图像选择器”并用相机拍照,然后按“确定”并返回到已返回到类似启动状态的应用程序(因此忘记了如何处理返回的图像)。它不会 100% 发生(甚至 50%),但足以成为一个大问题。

我的问题是:有什么办法可以防止这种情况发生,基本上是在显示这些模式视图时暂时减少我的内存占用,以免发生此问题?

这非常令人沮丧,因为一旦 UIImagePickerController 模态启动,我就几乎无法控制应用程序...并且在返回图像时会发生内存警告,所以我没有机会处理问题.到目前为止,我已经尝试在模式启动时从根视图中删除所有视图,等等,但运气不佳:(

【问题讨论】:

【参考方案1】:

你的问题对每个人都很明显,即使我也面临这个问题。实际问题出在 iPhone ImagePickerController 相机上……Apple 可能知道这个问题,并且可能正在尝试解决这个问题……除此之外,我们可以做的就是遵循内存管理规则。

http://www.slideshare.net/whalec1/ios-memory-management-basis

是一个很好的教程。

我使用下面的代码来管理我的应用程序中的内存......它在某种程度上对我有用,但无法完全治愈它。

   -(void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
    

        NSFileManager *manager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSString *diskCachePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"ImageCache"];
        if ([manager fileExistsAtPath:diskCachePath])
        
            NSError *error=nil;
            NSArray *files = [manager contentsOfDirectoryAtPath:diskCachePath 
                                                          error:&error];
            if(!error)
            
                for(NSString *file in files) 
                    [manager removeItemAtPath:[diskCachePath stringByAppendingPathComponent:file]
                                        error:nil];

                
            
        


        int i=0;
        for(id controller in self.tabBarController.viewControllers)
        
            if(i==presentTabIndex)
            
                i++;
                continue;
            
            if([controller isKindOfClass:[UINavigationController class]])
            
                UINavigationController *aController = (UINavigationController *)controller;
                [aController popToRootViewControllerAnimated:YES];
            
            else if([controller isKindOfClass:[UIViewController class]])
            
                UIViewController *aController = (UIViewController *)controller;
                [aController.navigationController popToRootViewControllerAnimated:YES];
            

            i++;
        
    

【讨论】:

有趣的例子;我看到您正在手动释放缓存的图像以帮助解决糟糕的相机问题。非常好。我实现了代码;我们会看看它是怎么回事。

以上是关于iOS UIImagePickerController 和 UIWebView 导致内存问题;呈现这些视图时如何保留我的应用程序的状态?的主要内容,如果未能解决你的问题,请参考以下文章

imagePickerController 选择照片时出错

iPhone - 以编程方式删除状态栏

如何调整自定义 UIButton 的图像大小?

从保存的相机胶卷参考 url 设置 uiimageview

Segue 图像到另一个视图控制器的问题

{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO