ios – 使用相机的UIImagePicker时始终会收到内存警告

我在viewController中使用了UI
ImagePicker,

有两种方法,我总是得到一个内存警告,以及非常着名的“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 = 
; self.photoView.photoView.image = self._photo; [self.photoButton setImage:self._photo forState:UIControlStateNormal]; [self dismissModalViewControllerAnimated: YES]; }

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

我知道处理照片会占用一些内存,因此获取内存警告是正常的.

但问题有时候,我的viewController只是在警告到来时释放一些重要内容,例如在导航堆栈中返回parentView控制器的某个按钮.

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

有什么办法可以解决吗?

最佳答案 并非所有内存“丢失”都是由泄漏引起的.使用快照.

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

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

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

要弄清楚结果披露以查看个别分配.

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

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

点赞