【问题标题】:Custom UIButton/Image Picker memory woes自定义 UIButton/Image Picker 内存问题
【发布时间】:2011-03-14 14:51:19
【问题描述】:

在我正在编写的 iOS 应用程序中,我们有一个“添加照片”按钮,该按钮很常见——当按下时,用户会看到一个操作表来拍摄或选择照片,转到相机或照片库,然后返回给控制器。选择图像后,它会调整大小并设置为被点击的原始按钮的背景。

为了帮助清理,我决定将很多此功能放在一个自定义按钮中,AddPhotoButton。当点击按钮时,AddPhotoButton 本身会处理操作表和图像选择器,而不是控制器。这在某些情况下效果很好,但在其他情况下我遇到了很多内存问题。当相机弹出时,包含按钮的控制器最终释放它,因此当 UIImagePickerController 尝试调用委托方法(AddPhotoButton 是它的委托)时,该对象不再存在,因为没有人拥有它。

那么,我真正要问的是——处理此类事情的最佳方法是什么?我希望将照片按钮功能(显示操作表、图像选择器,然后设置背景图像)全部捆绑在一起,这样很容易重复使用,但我采取的方法似乎不正确。但是,也许我做得正确,但应该以不同的方式保留按钮。

有什么想法吗?

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    您尝试执行此操作的方式通常是避免,因为您通过将逻辑存储在 GUI 元素的子类中,不必要地将界面与后台逻辑绑定。但是,您所做的一切在技术上都不是错误的,听起来它应该可以工作,您只是在处理错误的内存管理。所以我将提供两种可能的解决方案:

    修复内存管理 要告诉您如何解决这个问题,我必须查看一些代码。为什么旧的视图控制器释放按钮?您是在离开视图控制器还是在顶部添加另一个?

    改进类设计(首选) 您可以创建一个控制器类,而不是将您的逻辑添加到按钮子类。这根本不是视图或任何 gui 元素。我们称之为“ButtonBackgroundPicker”。此类将有一个方法说开始选择一个图像,该图像也将按钮更改背景作为参数。 ButtonBackgroundPicker 将处理所有逻辑,完成后,它将设置按钮的背景。按钮应该做的就是创建 ButtonBackgroundPicker 并调用该函数来选择一个图像,并为其提供对自身的引用。如果您希望能够为其他类型的 UI 元素选择背景,您可以在 ButtonBackgroundPicker 中创建该元素需要实现的协议,以便 ButtonBackgroundPicker 可以报告选择图像。然后,您可以将其设置为控制器的委托,而不是将元素与函数一起传递。

    首选这种设计的原因是它没有将 gui 和逻辑耦合在一起。您可以轻松扩展此设计以与其他 UIElement 一起使用。使用委托会更好,因为您可以使用相同的类和代码来完成几乎所有您想做的关于选择图像的事情。

    【讨论】:

    • 感谢您的回复。我最终只是修复了内存管理方面——我释放了 viewDidUnload 上的按钮,这导致了问题。我确实喜欢第二个选项,因为这样我可以在 viewDidUnload 中释放 UI 元素并只保留 Picker,所以我可能会在有机会时切换到它。
    猜你喜欢
    • 2012-11-29
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多