`

關於delegate

    博客分类:
  • ios
阅读更多

 

UIApplication接收事件,UIApplication響應事件(程序生命週期、系統事件)這就意味著通常沒必要對UIApplication進行修改,而只需考慮如何在UIApplicationDelegate中對UIApplication接收到的事件進行處理。處理系統事件需要編寫一個繼承自UIApplicationDelegate接口的類,而UIApplicationDelegate接口提供生命週期函數來處理應用程序以及應用程序的系統事件。應用程序UIApplcation被定義在MainWindow.xib文件中,並且有一個作為outlet的UIApplicationDelegate引用,當應用程序接收到諸如程序生命週期或系統事件時,UIApplication會調用UIApplicationDelegate中實現的相應的方法。

 

這樣做的好處是:

把程序的邏輯處理從UIApplication中分離出來;

避免了程序員直接從UIApplication派生子類,試想如果通 過從UIApplication派生子類的方法來管理應用程序的生命週期是多麼痛苦的一件事。

 

“委託模式”中一般有兩個對象參與處理同一個請求,所謂的請求在iPhone中就是應用程序生命週期和系統事件,接受請求的對象將請求委託給另一個對象來處理,同樣在iPhone中對應的是UIApplication在接收到生命週期和系統事件後委託給UIApplicationDelegate來處理。同樣,委託模式也是很多其它模式的基礎,如狀態模式、策略模式、訪問者模式本質上是在特殊的情況下採用了委託模式。委託模式使得可以用聚合代理繼承(即UIApplication類中包含一個UIApplicationDelegate接口成員)

 

iPhone不採用繼承體系而採用委託模式來實現聚合的原因,其更深層次在於IPhone框架的多樣化使得繼承無法保證子類行為的一致性,而委託模式恰恰是為了彌補繼承的這個缺點誕生的(說白了就是聚合嘛)。

 

在應用程序失去焦點前會調用delegate的applicationWillResignActive()方法,而應用程序再次獲取焦點時會調用applicationDidBecomeActive()方法。比如鎖屏會調用applicationWillResignActive()方法,解鎖調用applicationDidBecomeActive()方法。

而applicationDidReceiveMemoryWarning()方法則是在程序因內存洩露crash之前調用。

 

补充一下,今天跟joe先生讨论了一下,一般event的传递都有自己的chain,event顺着这个chain往上传递,直到有一个对象处理这个事件,这个事件才会停止传播,这个对象ios里叫响应者(responder),十分传神(当然,这是当你理解的时候,开始时我一直以为responder是焦点的持有者,十分nc的想法),而delegate提供给我们一个在对象接收到指定的event后处理该event的接口,究竟要不要处理该event,在于你实不实现这个delegate有关这个event的方法。

 

总的来说,对于delegate的实现方式还是有点confused,viewController里头有view,view里头的delegate又是viewController,十分纠结的模式。

 

再次补充:刚刚又看到一点,其实感觉delegate怪的原因是因为这个模式中两个对象间好像并没有清晰的从属关系,这样放在需要避免循环引用的Objective-C中好像不太合理,不过iphone开发中的delegate是以assign方式注入的属性,而不是其他像retain、copy等方式注入的能使reference count自增一个的属性,这样就避免循环引用的产生。

 

通常在使用对象时不是自己alloc、retain或copy的,就不用去release了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics