4

我在我的viewController使用UIImagePicker一个UIImagePicker时,总是内存警告与相机

,并有两种方法中,我总是得到一个内存警告,还有非常有名的“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当警告来临时重要的东西,比如在导航堆栈中返回到父视图控制器的一些按钮。

所以我不想得到一个内存警告,如果我的按钮或其他重要的东西将被释放得太早。

有什么方法可以解决它吗?

回答

2

不是所有的内存“损失”都是由泄漏引起的。使用堆叠。

使用仪器检查由于保留但未泄漏的内存而导致的泄漏和内存损失。后者是尚未使用的内存,仍然指向。在乐器上的分配乐器中使用Heapshot。

至于如何使用Heapshot查找内存creap,请参见:bbum blog

基本上有方法是运行仪器分配工具,取heapshot,运行代码的直觉和另一heapshot重复3或4次。这将指示在迭代过程中分配并未释放的内存。

为了弄清楚结果是否披露了个别分配。

如果你需要看到保留,发布和自动释放出现一个对象使用仪器:在仪器

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

0

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

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

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]; 
}