2011-03-14 51 views
0

在iOS應用我寫,我們有一個「添加照片」按鈕,這是很常見的 - 當按下用戶呈現一個動作片成可以接受或選擇一張照片,去相機或照片庫,然後返回到控制器。選擇圖像後,將其調整大小並設置爲原始按鈕的背景。自定義的UIButton /圖像選取器內存愁楚

以幫助清理的東西了,我決定把很多此功能的自定義按鈕,AddPhotoButton內。當點擊按鈕時,而不是處理操作表和圖像選擇器的控制器,它本身就是。這在某些情況下工作得很好,但在其他情況下,我遇到了很多內存問題。當相機彈出,包含按鈕控制器最終釋放它,所以當的UIImagePickerController試圖調用委託方法(AddPhotoButton是其代表),該對象不再存在,因爲沒有什麼擁有它。

那麼,什麼我真的問的是 - 什麼是對付這樣的事情的最好方法?我想將照片按鈕功能(顯示操作表,圖像選擇器,然後設置背景圖像)全部捆綁在一起,因此很容易重複使用,但似乎我採用的方法不正確。但是,也許我正確地做了,但應該保留按鈕的方式不同。

有什麼想法?

回答

1

你正在試圖做到這一點通常避免,因爲你是不必要地通過在GUI元素的子類存儲邏輯捆紮界面到背景邏輯的方式。然而,你所做的一切在技術上都是錯誤的,聽起來它應該起作用,你只是在處理內存管理錯誤。因此,我將提供兩種可能的解決方案:

修復內存管理 要告訴你如何解決這個問題我會看到一些代碼。爲什麼舊的視圖控制器釋放按鈕?你是從視圖控制器轉移還是將另一個添加到頂端?

改進類設計(首選) 而不是將您的邏輯添加到按鈕子類,您可以創建一個控制器類。這根本不是一個視圖或任何gui元素。我們稱之爲「ButtonBackgroundPicker」。這個類將有一個方法說,開始選擇一個圖像,也需要按鈕來更改作爲參數的背景。 ButtonBackgroundPicker會處理所有的邏輯,當完成時,它會設置按鈕的背景。所有的按鈕應該做的是創建ButtonBackgroundPicker並調用該函數來選擇一個圖像,給它自己的引用。如果您希望能夠爲其他類型的UI元素選擇背景,您可以在ButtonBackgroundPicker中創建一個該元素需要實現的協議,以便ButtonBackgroundPicker可以報告選擇圖像的情況。然後,不要將該元素傳遞給該函數,而應將其設置爲控制器的代理。

該設計的首選原因是它不會將gui和邏輯耦合在一起。您可以輕鬆擴展此設計以與其他UIElements配合使用。使用委託更好,因爲您可以使用相同的類和代碼來處理關於選取圖像的任何事情。

+0

感謝您的回覆。我最終只是修復了內存管理方面 - 我正在釋放viewDidUnload上的按鈕,這導致了問題。我喜歡第二種選擇,因爲那時我可以在viewDidUnload中釋放UI元素,並且只保留Picker,所以當我有機會時,我可能會切換到該選項。 – 2011-03-23 15:30:22