打开 UIPickerController 并关闭它时发生内存泄漏

Posted

技术标签:

【中文标题】打开 UIPickerController 并关闭它时发生内存泄漏【英文标题】:Memory leak while opening UIPickerController and closing it 【发布时间】:2011-11-05 12:06:58 【问题描述】:

这听起来可能是一个新手问题,但我是 ios 开发新手。

我有以下代码。

- (void) onUploadButtonClick

    UIImagePickerController* imgPicker = [[UIImagePickerController alloc] init];
    [[[UIApplication sharedApplication] keyWindow] setRootViewController:imgPicker];
    imgPicker.delegate = self;
    imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    imgPicker.allowsEditing = NO;
    [self presentModalViewController:imgPicker animated:YES];
    [imgPicker release];

我正在运行应用程序并分析内存泄漏,因此只需单击按钮并关闭它,而不做任何事情,我就会遇到内存泄漏。我在模拟器上运行这个。

任何想法为什么会发生这种情况?

更新:从探查器的控制台泄漏信息 泄漏的对象,#地址大小责任库责任框架

Malloc 32.50 KB,3   < multiple >    99840   MusicLibrary    MemNewPtrClear
 Malloc 32.50 KB,   0xa083800   33280   MusicLibrary    MemNewPtrClear
 Malloc 32.50 KB,   0x7840a00   33280   MusicLibrary    MemNewPtrClear
 Malloc 32.50 KB,   0x7806a00   33280   MusicLibrary    MemNewPtrClear


Leaked Object,# Address Size    Responsible Library Responsible Frame
Malloc 32.50 KB,    0xa083800   33280   MusicLibrary    MemNewPtrClear


Leaked Object,# Address Size    Responsible Library Responsible Frame
Malloc 32.50 KB,    0x7840a00   33280   MusicLibrary    MemNewPtrClear


Leaked Object,# Address Size    Responsible Library Responsible Frame
Malloc 32.50 KB,    0x7806a00   33280   MusicLibrary    MemNewPtrClear


Leaked Object,# Address Size    Responsible Library Responsible Frame
Malloc 128.00 KB,   0x128de000  131072  MusicLibrary    ReadITImageDB

【问题讨论】:

【参考方案1】:

为什么你会用 UIImagePickerController 做类似的事情?您实际上是在杀死您的实际 rootViewController。

 [[[UIApplication sharedApplication] keyWindow] setRootViewController:imgPicker];

只需删除此行,一切都会正常。

【讨论】:

实际上,即使删除该行内存仍然会泄漏。该行是为了避免在控制台中跟踪消息,还有其他方法可以删除该消息吗? 2011-11-05 16:25:21.791 PostCardPrinter[4769:207] 使用两阶段旋转动画。要使用更平滑的单阶段动画,此应用程序必须删除两阶段方法实现。 2011-11-05 16:25:21.793 PostCardPrinter[4769:207] 旋转多个视图控制器或视图控制器而不是窗口委托时,不支持使用两阶段旋转动画 找到这个链接。希望它会有所帮助。 ***.com/questions/2878947/… 是的,我就是这样做的,并在原始帖子中发布。仍然泄漏 究竟是什么对象被泄露了?在 Leaks 工具中,选择 Leaks,然后将泄漏的块交换到 Call Tree 并选中左侧的两个框 - 反转调用树和隐藏系统库。这将告诉您泄漏发生的确切时间以及哪条线路给您泄漏。 Total % # Leaks Bytes Symbol Name 100 2 160.50 KB -[MyiewController onUploadButtonClick] 这就是我得到的......仍然没有任何线索...... :(【参考方案2】:

您应该使用UINavigationController 并将UIImagePickerController 推到其上,或者以模态方式呈现UIImagePickerController。通过将UIImagePickerController 设置为您的根控制器,您将失去以前的rootViewController 并且将无法返回到它。内存泄漏可能是由于根UIViewController 错误地实现了viewDidUnload 和dealloc 方法。

【讨论】:

以上是关于打开 UIPickerController 并关闭它时发生内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何用JS打开新窗口,并关闭原来窗口

Visual Studio .exe 文件打开并立即关闭

如何打开关闭应用程序后打开的最后一个片段并使用导航抽屉和导航组件重新打开它

打开资源管理器窗口并等待它关闭

如何关闭并打开我的侧边栏

创建网格线并允许用户打开/关闭网格线视图