我在对象分配和释放方面遇到问题。我正在开发一些具有图像编辑功能的应用程序。当用户点击选择图像时,会出现 UIImagePickerController,然后当用户从库中选择图像时,UIImagePickerController 会关闭,然后有一个方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
//some logic
FilterViewController *filterViewController = [[FilterViewController alloc] initWithImage:imageToWorkWith
withDelegate:self];
/* present image processing screen, then release it */
[((UIViewController *)self.delegate) presentModalViewController:filterViewController animated:NO];
[filterViewController release];
}
然后出现FilterViewController - 图像编辑屏幕。点击“完成”按钮后,将调用下一个方法:
- (void)dismissWithDone {
[self.filterViewDelegate doneImageEdittingWithImage:self.imageToWorkWithView.image];
}
它调用:
#pragma mark - FilterViewDelegate
- (void)doneImageEdittingWithImage:(UIImage *)imageToSend {
//some logic
[((UIViewController *)self.delegate) dismissModalViewControllerAnimated:NO];
}
一切似乎都正常工作,但问题是 filterViewController 没有解除分配并保留在内存中。如果我将选择再次编辑一些照片,我的意思是如果创建 filterViewController 的方法将被再次调用,那么前一个实例将被释放并呈现新的实例,依此类推。我认为当调用 [UIViewController setChildModalViewController:] 时, filterViewController 的前一个实例在设置新实例时被释放。如果再添加一个版本:
[((UIViewController *)self.delegate) presentModalViewController:filterViewController animated:NO];
[filterViewController release];
[filterViewController release];
那么它将在解雇后被释放,但在创建新实例时将是 bad_access,因为它会尝试释放释放的实例。
我不明白的地方: 1. 为什么关闭filterViewController后,仍然有大于0的引用计数,导致不释放它?2. 为什么在再增加一个release的情况下,childModalViewController中deallocated对象的引用依然存在?