我在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),向下钻取,你将能够看到所有保留,释放和自动释放发生的位置.