打开 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 并关闭它时发生内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章