4

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 控制器的一些按钮。

因此,如果我的按钮或其他重要的东西过早释放,我不希望收到内存警告。

有什么办法可以解决吗?

4

3 回答 3

2

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

使用仪器检查由于保留但未泄漏的内存而导致的泄漏和内存丢失。后者是仍然指向的未使用内存。在 Instruments 上的 Allocations 工具中使用 Heapshot。

有关如何使用 Heapshot 查找内存占用,请参阅:bbum 博客

基本上有方法是运行 Instruments allocate 工具,拍摄一个 heapshot,运行你的代码的直觉和另一个 heapshot 重复 3 或 4 次。这将指示在迭代期间已分配但未释放的内存。

要弄清楚结果,请查看个人分配。

如果您需要查看对象使用工具的保留、释放和自动释放发生的位置:

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

于 2012-02-29T13:11:24.967 回答
0

当你使用 UIImagePickerController 时,你会得到一张照片。照片可能很大。以 8MP 板载摄像头为例,实际上是 8MP * 3 字节,因为每个像素都是 RGB,如果不打包,则为 8MP * 4 = 32MB。因此,您收到内存警告也就不足为奇了。

覆盖 didReceiveMemoryWarning 并清除内存。此外,视图可能会被卸载(在 iOS 6 之前),因此您必须能够在 viewWillLoad 中正确地重新加载它们。请参阅内存管理

于 2012-10-17T01:28:35.087 回答
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];
}
于 2013-08-06T13:37:33.323 回答