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 导致内存问题;呈现这些视图时如何保留我的应用程序的状态?的主要内容,如果未能解决你的问题,请参考以下文章
{python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO