【问题标题】:Memory issues with UIimagePickercontroller in iPhoneiPhone 中 UIimagePickercontroller 的内存问题
【发布时间】:2013-08-27 07:12:21
【问题描述】:

知道手动解决内存泄漏,它并不像 ARC 如何在 iOS 中处理释放不需要的对象那么容易,感谢 Apple 引入 ARC,它使工作变得容易。 但是我是一个坚持手动解决内存泄漏的人,因为我正在处理不使用 ARC 的相当旧的代码。好的,让我解释一下这个问题。我的应用程序包含在应用程序中捕获图片的代码。这是完成这项工作的一小段代码。

- (void) takePhoto
{
    ipc = [[UIImagePickerController alloc] init];
    NSLog(@"retain count of IPC is %d", [ipc retainCount]);
    ipc.delegate = self;
    NSLog(@"retain count of IPC is %d", [ipc retainCount]);

    if(ipc) {   
        ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
        NSLog(@"retain count of IPC is takephoto %d", [ipc retainCount]); 
        [self presentModalViewController:ipc animated:YES];
        NSLog(@"retain count of IPC is %d", [ipc retainCount]);
    } else {
        VSCore *vsCore = [[VSCore alloc]init];
        [vsCore MessageBox:@"Device does not support taking photos"withTitle:kInfoEN];
        [vsCore release]; // written on april 14th 2013
    }
}

我正在尝试追踪 ipc 对象的保留计数,因此我已将 NSlog 放在某些地方。一旦我设置了委托,(ipc.delegate = self); UIImagePickercontroller 的代表将被调用,其中之一是

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ }

在此处处理图像后,我正在打印 ipc 的保留计数,结果为 5,imagepickerdelegate 正在内部增加 ipc 的保留计数,但我只创建了一次 ipc 对象。根据此链接http://www.markj.net/iphone-memory-management-tutorial-video/。释放的数量应该等于保留计数。如果我不止一次调用释放,我将收到发送到已释放实例的消息。但保留 IPC 的数量仍然是 5。任何人都可以帮我解决这个问题。谢谢,

我正在另一个类中发布 Ipc,我已将 ipc 声明为单个 ton 类中的属性,我正在像这样发布 ipc...

[[[VVideoDevice getInstance] ipc ] release];

ipc 是 vvideodevice 类中的一个属性。

【问题讨论】:

  • 为什么不能启用 ARC?它将消除所有这些问题,并且 Xcode 有一个内置的“转换为 ARC”菜单选项,使其变得容易。
  • 另外,您是否尝试过使用静态分析器?而不是“运行”选择“分析”。这很适合发现保留/释放错误。
  • 明智地启用 ARC 类会有效吗?我会试试的。但想知道保留计数是如何自动增加的。
  • 在示例代码中,您已显示 ipc 的保留计数应仅为 1。您已分配/初始化该类一次,因此您只需释放一次。你想在哪里发布ipc?你能显示给你发布错误的代码吗?另外,您是否使用仪器来确定内存泄漏发生的位置?另外,是什么阻止您转换为 ARC?苹果现在推荐它。最好的方法是将您的代码提交到源代码管理。创建一个新分支并在新分支上进行转换。这样您就可以检查它是否有效(它会)并稍后合并。
  • @bbum 你把我的名字弄错了,它有自动完成功能吗?啊,我的错。这个想法仍然是正确的。无论哪种方式,静态分析器或 ARC 都是他需要去的地方。

标签: ios memory-leaks


【解决方案1】:

retainCount 没用。不要调用它。

如果关于内存管理的视频告诉您对象的绝对保留计数是有意义的,那么它是一个糟糕的教程。

您应该平衡您的保留与发布调用;将每个保留视为计数的 +1,并通过释放来平衡它。

使用 ARC。使用分配工具监控内存使用情况。最后,使用静态分析器来帮助确保您的代码是正确的。

请参阅http://www.whentouseretaincount.com 了解更多信息。

【讨论】:

  • 但实际问题是 UIImagePickerController 确实泄漏了。甚至苹果的拍照示例代码也泄露了。这是一个框架级别的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多