Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iPhone中UIimagePickercontroller的内存问题_Ios_Memory Leaks - Fatal编程技术网

Ios iPhone中UIimagePickercontroller的内存问题

Ios iPhone中UIimagePickercontroller的内存问题,ios,memory-leaks,Ios,Memory Leaks,要知道,手动解决内存泄漏问题并不像ARC在iOS中处理释放不需要的对象那么容易,这要感谢苹果公司引入ARC,这使工作变得容易。 但我是一个坚持手工解决内存泄漏问题的人,因为我正在编写不使用ARC的非常旧的代码。好的,让我解释一下问题。我的应用程序包含在应用程序中捕获图片的代码。下面是执行此任务的一小段代码 - (void) takePhoto { ipc = [[UIImagePickerController alloc] init]; NSLog(@"retain count

要知道,手动解决内存泄漏问题并不像ARC在iOS中处理释放不需要的对象那么容易,这要感谢苹果公司引入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的retain count,结果是5,imagepickerdelegate在内部递增ipc的retain count,但我只创建了ipc对象一次。根据这个链接。释放次数应等于保留计数。若我多次调用release,我将收到发送到解除分配实例的消息。但ipc的保留计数仍为5。有人能帮我解决这个问题吗。谢谢

我在另一个类中发布Ipc,我在一个单吨类中将Ipc声明为属性,我像这样发布Ipc

[[[VVideoDevice getInstance] ipc ] release];

ipc是vvideodevice类中的一个属性。

重新计数无效。不要叫它

关于内存管理的视频是一个可怕的教程,如果它指示您对象的绝对保留计数是有意义的

你应该平衡你的保留和释放调用;将每个保留视为计数的+1,并用释放进行平衡

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


有关更多信息,请参阅

为什么不能启用ARC?它将消除所有这些问题,Xcode有一个内置的“Convert to ARC”菜单选项使其变得简单。另外,您是否尝试过使用静态分析器?选择“分析”而不是“运行”。这有助于发现保留/释放错误。启用ARC类是否有效?我试试看。但是我想知道保留计数是如何自动递增的。在您显示的示例代码中,ipc的保留计数应该只有1。您已经分配/初始化了该类一次,因此您应该只需要发布一次。你想在哪里发布ipc?您能否显示导致发布错误的代码?另外,您是否使用仪器来确定内存泄漏发生的位置?还有,是什么阻止您转换为ARC?现在苹果公司推荐它。最好的方法是将代码提交给源代码控制。创建新分支并在新分支上转换。这样你就可以检查它是否正常工作(可以),然后在以后合并。@bbum当它有自动完成功能时,你把我的名字弄错了?啊,我错了。不过,这个想法仍然是正确的。无论哪种方式,静态分析器或ARC都是他需要去的地方。但实际问题是UIImagePickerController确实存在泄漏。甚至连苹果公司的拍照示例代码都泄露了。这是一个框架级错误。