【问题标题】:Memory leak from Apple CameraUI codeApple CameraUI 代码的内存泄漏
【发布时间】:2012-04-15 13:38:20
【问题描述】:

我使用了 Apple 的“iOS 相机编程主题”指南中的一些代码,如下所示:

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

// Displays a control that allows the user to only take picture:
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];

// Hides the controls for moving & scaling pictures, or for trimming movies. To instead show the controls, use YES.
cameraUI.allowsEditing = NO;

cameraUI.delegate = delegate;

[controller presentModalViewController: cameraUI animated: YES];
[cameraUI release];

但是,当我“分析”我的代码时,Xcode 说我有可能从以下行泄漏:

cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];

除了上面显示的以外,我没有其他release 命令。鉴于有问题的数组是 cameraUI 的一个属性(已发布),我不确定我应该做什么(如果有的话)。

有什么想法吗?

【问题讨论】:

    标签: objective-c ios memory-management memory-leaks camera


    【解决方案1】:

    除非cameraUI.mediaTypes 属性是用assign 定义的,否则这里确实存在泄漏。将生产线分成多个步骤可能会有所帮助,仅供参考。

    NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
    cameraUI.mediaTypes = mediaTypes;
    

    如果cameraUI 处理自己的内存,那么您分配什么或何时分配都无关紧要。但是,在第一行中,您正在构造一个变量,但从未释放它。那么,你如何解决这个问题?修复它的标准方法是在构建过程中自动释放。

    cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
    

    如果您正在处理必须尽快释放的非常大的对象,则需要在将其传递给 cameraUI 后手动释放它:

    NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
    cameraUI.mediaTypes = mediaTypes;
    [mediaTypes release];
    

    仅在需要时才使用第二种形式 - 它更容易出错。

    【讨论】:

    • 啊,明白了。是的,这行得通。快速提问...为什么第二种形式更容易出错(我在整个应用程序中都有类似的编码)。
    • 第二种形式在您编写时可以正常工作,但是随着程序的增长,很容易在分配和释放之间放置几行代码。然后在某些时候你不小心删除了发布,或者将它移动到 if 语句中。第一个版本更难意外破解。另一方面,将所有内容都放在自动释放池中可能意味着您在池耗尽之前耗尽内存......
    • 啊,是的——现在一切都说得通了。所以很容易出现人为错误!!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多