簡體   English   中英

Objective-c 中的代表

[英]Delegates in Objective-c

在目標 c 中使用 controller 作為各種協議實現的代表是正常做法嗎? 我說的是使用 iOS SDK 時,還是讓單獨的類來接管代表的角色是個好主意? 或者它只是一個最適合場景的案例? 我對目標 c 的最佳實踐非常好奇,因為我正在學習孤立地對其進行編碼並且沒有“現實世界”專家可以求助。

“控制器”側重於所有權和外觀。 外部對象將與 controller 而不是受控對象對話。 通常應該直接與 UITableView 對話的唯一UITableViewUITableViewController controller 通常擁有受控 object 和 controller 至少應該具有與受控一樣長的壽命。

“代表”側重於行為、策略和觀察者。 一個 object 要求其代表提供有關行為的指導(我應該顯示此數據嗎?應該是什么顏色?我可以執行此操作嗎?)。 當有趣的事情發生時,一個 object 會告訴它的代表(我被感動了。我即將完成一些事情。我遇到了一個問題。)一種特殊的代表回答數據問題(第 3 行有什么數據?)。 這些被稱為數據源。

系統的 rest 與“控制器”對話很常見,通常不適合與“代表”對話。 因此,例如,擁有一個指向UITableViewController的指針並從系統中的其他位置向它發送消息通常是合適的。 有一個指向控制器的tableView的指針是不合適的; 你應該通過 controller 工作。 另一方面,如果你有一個指向 object 的指針,通常不適合要求它的delegate 如果需要,您可能設計了錯誤的東西。 (最值得注意的例子是[[NSApplication sharedApplication] delegate]這幾乎總是錯誤的談話對象。AppDelegate 是應用程序的代表,而不是全局變量的垃圾場。)

如果 object 具有 controller,則 controller 幾乎總是代表。 根據您所討論的上述規則,當 object 既是 controller 又是委托時,則它是 controller。

單個 object 有可能成為幾件事的代表,特別是如果大多數事情都是短暫的(例如警報視圖)。 UIViewController被委托處理一些事情並不罕見。

  1. 將代表保持為單獨的類也使代碼干凈且可移植。 您只需復制和粘貼它們並進行細微更改,就可以將這些委托類重用於其他目的。

  2. 將代表保持在相同的 class 中比將它們保持在單獨的類中具有優勢。 您可以輕松訪問 class 中的私有變量/對象,這在第一種情況下是不可能的。

  3. 如果您將委托分開並希望將一些值傳遞給主 class,您可能必須創建另一個委托:-) 或添加觀察者,或者您必須使用某些屬性傳遞它們。

簡短的回答:是的,視圖 controller 作為它管理的視圖(或多個視圖)的代表是很常見的。

示例: UITableViewController 是一個 class 設計用於管理 UITableView 實例,它實現了表視圖委托和表視圖數據源協議(數據源只是另一種委托)。 同樣,視圖 controller 作為選擇器視圖、搜索欄、文本字段等的代表也是很自然的。

理由:視圖確實不應該知道它們顯示的數據來自哪里,但是視圖控制器知道,因此它們很自然地提供數據並決定給定視圖的行為方式。 對於其他類型的對象也是如此,但您必須使用一些常識。 該應用程序有自己的委托 object,它通常負責創建至少一些視圖控制器,並且通常負責創建數據 model,因此顯然由視圖 Z594C103F2C6E0310C3D8ABE059F 扮演該角色是沒有意義的。

最佳實踐取決於需求以及代碼方面。 最常用的最佳實踐是 MVC 模式。 一旦你實施它,你就會明白這個想法。 您還可以閱讀一些設計模式。 但對於 iPhone,我更喜歡 MVC。 對於代表來說,是的,objective-c 中的正常做法是使用 controller 作為代表。 objective-c就是這樣設計的。

如果您打算將信息廣播到應用程序的多個部分,NSNotification 是一個不錯的選擇(即使它可能會使其他人理解起來有點復雜)。

在其他情況下,讓一個委托與協議相關聯是一個很好的選擇,可以使事情在代碼方面變得清晰和隔離。

KVC 也是在代碼中實現交互的另一種方式: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html

根據您的計划,一種解決方案可能比另一種更好,最好的方法是使用每種解決方案以了解更多信息......當您設計下一個 iOS 時,它將幫助您做出正確的決定應用 !

這里是 go:

假設您有一個 class A 和另一個 B。

“a”是 class A 的 object

在“a”中,如果您將 B 實例化為“b”並傳遞給它自己,即“a”

現在您可以輕松觸發您剛剛傳遞給“b”的變量“a”的方法,因為您可以訪問該 object。 但是,當您完成 class B 並開始釋放“b”時,破壞就開始了。 現在因為使用了“a”,所有分配給“b”的memory都會被釋放但也不會被釋放,只要“a”沒有被釋放就會被糾纏。 如果您遞歸地使用 class B 的實例化,上帝保佑您。

因此,通過使用委托,您可以使用 class A 的所有所需方法,並使自己遠離這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM