iphone - 自定义 UIButton/图像选择器内存问题

标签 iphone objective-c ios

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

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

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

有什么想法吗?

最佳答案

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

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

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

这种设计受到青睐的原因是它没有将 GUI 和逻辑耦合在一起。您可以轻松扩展此设计以与其他 UIElement 一起使用。使用委托(delegate)甚至更好,因为您可以使用相同的类和代码来完成与选择图像有关的几乎任何您想做的事情。

关于iphone - 自定义 UIButton/图像选择器内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5300245/

相关文章:

javascript - 在 PhoneGap 中使用 JavaScript 创建和使用 iOS settings.bundle 值

iphone - iPhone SDK中的ASIHTTP请求已取消错误

objective-c - 休息套件 "*** Assertion failure in -[RKManagedObjectMapping initWithEntity:]"

ios - 在运行时更改方向更改 ViewControllers

ios - 在 iOS 中获取 YouTube channel 内容

android - 如何在范围内自动连接 BLE 设备?

iphone - iOS 中如何检查直线相交?

iphone - 将长按手势和拖动手势结合在一起

ios - 为不受支持的语言选择本地化

iphone - 如何从 UITouch 识别 Touch Up Inside 手势