使用适用于相机的UIImagePicker时,始终会收到内存警告

时间:2012-02-29 13:02:18

标签: ios uiimagepickercontroller viewcontroller memory-warning

我在UIImagePicker中使用了viewController

有两种方法,我总是得到一个内存警告,以及非常有名的“wait_fences:未能收到回复:10004003”,

但我无法追溯到提示警告的特定代码行 - 它总是在我无法调试的某些方法之后立即出现。

// in myViewController.h

// the first 2 are the methods that I alloc my UIImagePicker,
// here, self.photoPicker is a retained property of UIImagePicker.
- (IBAction)fromAlbumButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}

- (IBAction)fromCameraButtonTapped {
    if (self.photoPicker == nil) {
        self.photoPicker = [[[UIImagePickerController alloc] init] autorelease];
        self.photoPicker.delegate = self;
    }
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        self.photoPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentModalViewController:self.photoPicker animated:YES];
        return;
    }
}
// and this is another part that gives me the memory warning - getting a photo.
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info {
    self._photo = [info objectForKey:UIImagePickerControllerOriginalImage];
    self.photoView.photoView.image = self._photo;
    [self.photoButton setImage:self._photo forState:UIControlStateNormal];
    [self dismissModalViewControllerAnimated: YES];
}

我已经检查了我的代码,发现没有潜在的内存泄漏,我可以说。

我知道处理照片确实需要一些记忆,所以记录内存是正常的。

但问题有时候,我的viewController只是release在警告到来时有些重要的东西,比如在导航堆栈中回到parentView控制器的某个按钮。

因此,如果我的按钮或其他重要内容过早发布,我不希望得到内存警告。

有没有办法解决它?

3 个答案:

答案 0 :(得分:2)

并非所有内存“丢失”都是由泄漏引起的。使用快照。

使用仪器检查由于保留但未泄漏的内存导致的泄漏和内存丢失。后者是未使用的内存,仍然指向。在仪器上的分配工具中使用快照。

如何使用“快照”查找内存褶皱,请参阅:bbum blog

基本上有一种方法是运行仪器分配工具,获取快照,运行代码直观和另一个快照重复3或4次。这将指示在迭代期间分配但未释放的内存。

要弄清楚披露的结果,以查看个别分配。

如果您需要查看对象使用仪器的保留,释放和自动释放的位置:

在仪器中运行,在分配中设置“记录参考计数”(您必须停止记录以设置选项)。导致选择器运行,停止记录,搜索那里的ivar(datePickerView),向下钻取,你将能够看到所有保留,释放和自动释放发生的位置。

答案 1 :(得分:0)

当你使用UIImagePickerController时,你会得到一张照片。照片可能很大。例如,使用8MP板载摄像头,实际上是8MP * 3字节,因为每个像素都是RGB,如果没有打包,则为8MP * 4 = 32MB。所以你得到记忆警告并不奇怪。

覆盖didReceiveMemoryWarning并清除内存。此外,可以卸载视图(在iOS 6之前),因此您必须能够在viewWillLoad中正确地重新加载它们。见Memory Management

答案 2 :(得分:0)

更改以下内容

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageView setImage:image];
[self dismissModalViewControllerAnimated:YES];
}

以下......

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self dismissModalViewControllerAnimated:YES];
[imageView setImage:image];
}