Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 自定义UIButton/图像选择器内存问题_Iphone_Objective C_Ios - Fatal编程技术网

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

Iphone 自定义UIButton/图像选择器内存问题,iphone,objective-c,ios,Iphone,Objective C,Ios,在我正在编写的iOS应用程序中,我们有一个非常常见的“添加照片”按钮——当按下按钮时,用户会看到一张可以拍摄或拾取照片的操作表,进入相机或照片库,然后返回控制器。选择图像后,将其调整大小并设置为点击的原始按钮的背景 为了帮助清理,我决定在一个自定义按钮,AddPhotoButton中添加很多这类功能。点击按钮时,不是由控制器处理操作表和图像选择器,AddPhotoButton本身执行操作。这在某些情况下效果很好,但在其他情况下,我遇到了很多内存问题。当相机弹出时,包含按钮的控制器最终会将其释放,

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

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

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


有什么想法吗?

您尝试这样做的方式通常是避免的,因为您将逻辑存储在GUI元素的子类中,从而不必要地将界面绑定到后台逻辑。然而,您所做的任何事情在技术上都是错误的,而且听起来它应该可以工作,您只是在处理内存管理错误。因此,我将提供两种可能的解决方案:

修复内存管理 要告诉您如何修复,我必须查看一些代码。为什么旧的视图控制器会释放该按钮?您是正在从视图控制器转移,还是正在将另一个添加到顶部

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


首选此设计的原因是它不会将gui和逻辑耦合在一起。您可以轻松地扩展此设计以使用其他UIElement。使用委托甚至更好,因为您可以使用相同的类和代码来处理与选择图像相关的几乎所有操作。

感谢您的回复。我最终只是修复了内存管理方面的问题——我正在释放viewDidUnload上的按钮,这导致了一些问题。我确实喜欢第二个选项,因为这样我可以在viewDidUnload中释放UI元素,并且只保留选择器,所以我可能会在有机会时切换到该选项。