22

这让我疯狂!收到内存警告。当显示UIImagePickerController时级别= 1

无论何时我尝试使用sourceType = UIImagePickerControllerSourceTypeCamera显示UIImagePickerController,我都会收到“Received memory warning。Level = 1”。

这里是我的viewDidLoad中的代码,我设置好了:

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    // Set card table green felt background 
    self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]]; 


    // Init UIImagePickerController 
    // Instantiate a UIImagePickerController for use throughout app and set delegate 
    self.playerImagePicker = [[UIImagePickerController alloc] init]; 
    self.playerImagePicker.delegate = self; 
    self.playerImagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
} 

这里是我如何呈现这些情节模态..

- (IBAction) addPlayers: (id)sender{ 
[self presentModalViewController:self.playerImagePicker animated:YES]; 

}

结果.. UIImagePicker开始显示然后繁荣......我收到内存警告......每次!有趣的是,如果我切换到sourceType = UIImagePickerControllerSourceTypePhotoLibrary ...一切工作正常。

我到底在想什么,或者做错了什么?我想要做的就是展示相机,拍摄并保存照片。

仅供参考 - 我正在测试我的3GS设备。

由于任何人谁可以帮助:)

回答

17

这是very common。只要你处理记忆警告而不崩溃,并有足够的空间继续前进,不要让它让你发疯。

+9

非常感谢!在大多数教科书和课程中一般都会找到所有IBOutlet的建议,但这只是简单的错误(实际上,在-didReceiveMemory警告中也应该/不应该这么做)。 – wgpubs 2010-06-24 22:49:52

5

现在,我升级到4.0后,它也发生在我的应用程序 - 在3.1之前没有警告。

其实正如你以前说过的那样,应该没有问题。但是,这会导致在它再次加载并且正在调用viewDidLoad之后出现的视图。这会弄乱我的应用程序,因为我在viewDidLoad中初始化视图 - 现在它会重新初始化 - 即使它不应该。

就像评论一样,这可能也会发生在许多其他依赖加载视图的应用程序上!

+0

这种情况也发生在我身上,对我的应用程序造成了灾难性的后果。你能解决这个问题吗? – 2010-09-28 00:06:38

+0

绝对是正确的 - 这真的弄乱了代码,并强制其他照顾,这是非常复杂的。必须为每次重新加载的特定情况设置!不知道别人是如何处理这件事的。但从此以后,它再也没有发生过...... – user387184 2011-01-18 23:59:46

+0

顺便说一句 - 我相信它在4.x而不是3.x上发生在你身上的原因是,当你退出时,你的APP可以在后台生活。因此,您从未体验过viewDidUnload和didReceiveMemoryWarning。我的应用程序在viewDidUnload中崩溃,我发现我编写了一个可怕的工作。当我更改APP属性和实例变量时,我忽略了dealloc和viewDidUnload中的版本。 - 我只是猜测。 – mobibob 2011-09-16 19:44:03

4

它确实发生在我的应用程序中我也是在iOS 4.0上做的。这是不一致的,但最常见的原因是创建一个实例并导航到存储在其中一张专辑中的某张大照片。
通过在didReceiveMemoryWarning方法中保持状态并在viewDidLoad方法中从状态加载来修复。需要注意的是,要记住清除状态持久的文件,并将其保存在适用于您的应用程序的正确位置。对我来说,在正常情况下它会离开相关的UIViewController。

1

我在打开UIImagePickerController时也收到了内存警告。我也在4.01上。 但是,此外,UIImagePickerController正在运行关闭快门动画,并在屏幕上关闭快门时停止。

看起来像UIImagePickerController的内存警告行为是关闭自己。 我可以从didReceiveMemoryWarning方法中的父视图控制器中关闭UIImagePickerController,但这会造成糟糕的用户体验。

有没有人看到这个问题? 有没有办法处理内存警告,以便UIImagePickerController不会自行关闭?

+0

嘿艾迪,你可能想把它作为一个单独的问题,并发布相关的代码。在这里,UIImagePikcerController按预期工作,除了我得到的“意外”内存警告......实际上它似乎是其正常操作的一部分。无论如何,如果你发布了一个问题,让我知道,我很乐意看看...我更熟悉UIImagePickerController比我曾经希望是:) – wgpubs 2010-09-28 22:37:43

+0

感谢您响应wgpubs。我重新发布了你的建议。 http://stackoverflow.com/questions/3840234/uiimagepickercontroller-stalls-shut-on-memory-warnings。我今天要尝试的想法是在其他ViewController中释放更多内存,以查看是否有助于UIImagePicekrController恢复生机。很想听听你的建议。 – eddy 2010-10-01 14:45:29

1

我一直在努力解决相同的问题一段时间了。然而,重置我的iPhone 4(清除内存)解决了这个问题,所以它不是一个真正的应用程序问题。

看来1级或2级内存警告会触发UIimgPickerController委托来卸载自身。在我的应用程序中,代理人的代表也一样(是的,可以)。但是,在内存警告之后,它会再次加载委托(以及委托),导致viewDidLoad执行任何代码。

我不确定这只会在使用UIimgPickerController时发生,因为测试所有这些都非常耗时。

我可以写一些额外的代码来防止viewDidLoad中的代码viewWillAppear从执行时显示UIimgPickerController但这不是优雅的,对吗?

这里的深思:它可能是 您正在运行内存 因为你正在测试您的应用程序。随着 一些内存泄漏,这是非常好的 可能你正在努力为 每次你调试这个问题。

6

这不是关于你的应用程序使用了多少内存,因为即使你编写了一个非常简单的应用程序,只有一个按钮,点击按钮然后打开摄像头,它可能会发生。 我已经在iPhone 3GS,iPad 2和iPod touch 3G上测试过。它只发生在iPhone 3GS中。 我发现它不会再发生,如果你重新启动你的设备,然后再执行你的应用程序。

另一个真正的解决方案是在您的viewController中注释代码[super didReceiveMemoryWarning]

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

经过大量的试验对iPhone 3GS的iOS 4.3.2,我发现逻辑可能会喜欢: - >打开不亚于后台运行的应用程序 - >呈现的UIImagePickerController的imagePicker,点击“后退”或 “保存” 从imagePicker - > ApplicationDelegate的方法,applicationDidReceiveMemoryWarning:(UIApplication *)application,将被调用 - >然后视图控制器的方法,didReceiveMemoryWarning:,将被调用 - >然后viewDidUnload - >然后viewDidLoad中

然后,你可以找到一些意见有蜜蜂n发布,目前的观点已被指向意想不到的一个。

默认情况下,[super didReceiveMemoryWarning]将在ViewController的didReceiveMemoryWarning方法被调用时运行。评论它,并且viewDidUnload:viewDidLoad:方法将不会被调用。这意味着mem警告已被完全忽略。这就是我们所期望的。

+0

评论'[super didReceiveMemoryWarning];'似乎解决了这个问题。但是,这是正确的做法。 – 2012-08-07 09:39:11

+0

我也有同样的问题。其实,即使我没有这个方法。 - (void)didReceiveMemoryWarning。该怎么办? – sathiamoorthy 2013-04-17 13:16:40

1

UIImagePickerControllerDelegate是一个内存猪,因为您正在捕捉高内存资源,即图像或视频。所以,从一开始就一定要指定媒体撷取设置为起点,降低这一点,如果你并不需要的品质:

UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
picker.delegate = self; 
picker.videoQuality=UIImagePickerControllerQualityTypeMedium; 

然后收集和利用这些资产之后。从应用程序临时文件夹中删除任何临时文件。可能是一个额外的迷恋步骤,但它是一个很好的习惯:

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if ([fileManager fileExistsAtPath:[lastCapturedFile substringFromIndex:7] ]) { 
    NSError *error; 
    // Attempt to delete the folder containing globalDel.videoPath 
    if ([fileManager removeItemAtPath:[lastCapturedFile substringFromIndex:7] error:&error] != YES) { 
     NSLog(@"Unable to delete recorded file: %@", [error localizedDescription]); 
    } else { 
     NSLog(@"deleted file"); 
    } 
} 

以上它是清除由委托创建的文件。在某些情况下,如果您正在转码或创建自己的资产,请使用该文件删除该文件夹。注意上面,我是去掉“文件://”的URL字符串的一部分作为文件管理器不喜欢它:

[lastCapturedFile substringFromIndex:7] 

其他的事情要考虑的各种文档中涵盖了对您所做什么该资产 - 转码,图像尺寸缩小等等。请注意,如果显示UIImagePickerViewController,则使用AVFoundation的任何代码转换都将崩溃。