【问题标题】:Memory leak on presentModalViewControllerpresentModalViewController 上的内存泄漏
【发布时间】:2012-05-25 10:37:06
【问题描述】:

我正在为用户打开相机拍照。 当我拍照并按下“使用”时,我不断出现内存泄漏: [self presentModalViewController:imagePicker Animation:YES],

完整代码:

imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;      
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.mediaTypes = [NSArray arrayWithObjects:
                              (NSString *) kUTTypeImage,
                              (NSString *) kUTTypeMovie, nil];
imagePicker.allowsEditing = NO;

[self presentModalViewController:imagePicker animated:YES]; //This leaks

didFinishPickingMediaWithInfoimagePickerControllerDidCancel 我都写了这行:

[imagePicker dismissModalViewControllerAnimated:YES];

我确实知道之前有人问过这个问题,但没有人能帮助我进一步解决我遇到的泄漏问题。

【问题讨论】:

  • ARC 还是手动内存管理?
  • 我确实使用 ARC。非手动

标签: objective-c xcode memory-leaks instruments


【解决方案1】:

如果不是 ARC 环境:

你的 imagePicker = [[UIImagePickerController alloc] init]; 返回保留计数 +1,

那么 [self presentModalViewController:imagePicker animated:YES] 保留你的控制器,所以保留 count +2,

[imagePicker dismissModalViewControllerAnimated:YES]; 它是 +1,所以你的控制器仍然挂在内存中。

presentModalViewController之后释放你的控制器。

【讨论】:

  • 我正在使用 ARC。使用 ARC 时有没有办法解决这种泄漏?
【解决方案2】:

试试这个代码

imagePicker = [[[UIImagePickerController alloc] init] autorelease];

确定你有什么

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

// your code

[pool release];

【讨论】:

  • 我在 iOS 5.1 中工作,所以如果 ARC 开启,这是不允许的
【解决方案3】:

原来这是 iOS 本身代码中的一个错误。

我下载了 Apple 开发者网站的示例代码,发现了同样的漏洞。 所以这将不是我自己能解决的问题,我希望这能很快得到纠正。

【讨论】:

  • 你确定这是 iOS 的错误吗?还是 Apple 的示例代码也错了?
  • 因为即使是 UIImagePickerController 的单例也无济于事并且仍然会泄漏内存,我非常确信这是 iOS 本身的错误,而不是示例代码中的错误。
【解决方案4】:

如何为imagePicker 创建一个@property 并分配:

self.imagePicker = [[UIImagePickerController alloc] init];

【讨论】:

  • 我确实尝试过,但它仍然以完全相同的方式泄漏。
猜你喜欢
  • 1970-01-01
  • 2012-12-23
  • 2017-02-28
  • 2017-04-14
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多