成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Objective-C學習之路 委托模式

移動開發 iOS
本文介紹的是Objective-C學習之路 委托模式,在Objective-C中,經常提到委托模式(delegate),非常重要,我們來看內容詳解。

Objective-C學習之路 委托模式是本文要介紹內容,委托模式很重要,比如官方交互API,委托模式使用的很常見,比如UIView的setAnimationDelegate,設置動畫的委托。不理解委托模式,就不能很快的理解很多API的使用,因為它們使用一樣的模式,了解這個模式,就會心領神會,立即上手。

下面用通俗的話說說委托模式是干什么用的。實際上Objective-C中的委托模式,類似于Java中的回調(CallBack)機制,或者說監聽器機制。再或者說,類似JavaScript語言里面的onclick事件和函數的作用。比如要實現點擊一個按鈕之后做什么事情,這里肯定有個視圖類,有個控制類,無論你是使用什么語言和開發工具。視圖類能知道用戶什么時候點擊了按鈕,但是不知道點擊了以后做什么,控制類知道點擊按鈕后做什么,而不知道何時用戶會點擊。那么,可以將控制類委托給視圖類,當點擊的時候視圖類調用控制類。

如果使用過Java的Swing等做本地圖形界面開發,應該知道在視圖類中包含了大量的(匿名)內部類,或者要注冊監聽器,這些機制起到和Objective-C委托類似的功效。可以這樣理解:監聽器、(匿名)內部類是實現怎么做的部分,但是不知道何時會發生事情,視圖類在事件發送時調用監聽器、(匿名)內部類,視圖類是知道何時發生事情的。

寫個簡單的示例,是在main方法里寫的,模擬一下委托在視圖和控制中的作用。這里面,我有一個屏幕(Screen)類,就把它當視圖吧。需求是當點擊屏幕的時候爆炸。那么我有個動作(Action)類,它會實現爆炸動作。

用協議實現委托模式

下面的代碼寫的很生硬,后面會逐漸演化為合理的實現。第一個示例只是想說明技術上如何實現,沒有實際運用上的意義。

這里因為是模擬,可以把main方法看作是用戶再操作界面,通過點擊創建了個視圖(Screen),然后調用Screen的實例方法onTouch,這里模擬用戶用手點擊了屏幕:

  1. #import <Foundation/Foundation.h>   
  2. #import "Screen.h"  
  3. int main (int argc, const char * argv[]) {   
  4.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  5.     Screen *screen=[[Screen alloc] init];   
  6.     screenscreen.delegate=screen;   
  7.     [screen onTouch];   
  8.     [screen release];   
  9.     [pool drain];   
  10.     return 0;   

這里先不用管:

  1. screenscreen.delegate=screen; 

后面再說。

Action類,在這里用協議來實現:

  1. #import <Cocoa/Cocoa.h> 
  2. @protocol Action <NSObject> 
  3. - (void) doAction;  
  4. @end 

是一個協議,該協議繼承了NSObject協議。這里要注意,NSObject在這里不是類,確實有同名類。這個協議定義了一個doAction方法,這個方法可實現比如“屏幕爆炸”的需求。

下面說說屏幕(Screen)類,頭文件:

  1. #import <Foundation/Foundation.h>   
  2. #import "Action.h"  
  3. @interface Screen : NSObject <Action> {   
  4.     id <Action> delegate;   
  5. }  
  6. @property(nonatomic,retain) id <Action> delegate;  
  7. - (void) onTouch;  
  8. @end 

這里的onTouch方法,就是模擬Screen被用戶點擊后調用的方法。Screen類實現了Action協議。然后它還有個Action類型的成員delegate。為了能設置delegate實例變量,還為它設置了property。

下面看看實現文件:

  1. #import "Screen.h"  
  2. @implementation Screen  
  3. @synthesize delegate;  
  4. - (void) onTouch{   
  5.     NSLog(@"on touch …");   
  6.     if ([delegate conformsToProtocol:@protocol(Action)] &&   
  7.         [delegate respondsToSelector:@selector(doAction)]) {   
  8.         [delegate performSelector:@selector(doAction)];   
  9.     }   
  10.     NSLog(@"on touched.");   
  11. }  
  12. - (void) doAction{   
  13.     NSLog(@"Bang!!!!!!!!!");   
  14. }  
  15. @end 

這里重點看onTouch方法內部代碼,要判斷delegate是否是Action協議,而且是否有doAction方法,這個判斷夠嚴謹了。如果正確,就調用Action協議的doAction方法。

實際上未必要讓Screen實現Action協議,雖然開發中經常是類似這樣的做法。任意的實現Action協議的類實例都可以設置給screen的delegate屬性。

上面的示例和開發中碰到的情況不很像,實際情況往往類似下面示例的樣子。首先看看main方法:

  1. #import <Foundation/Foundation.h>   
  2. #import "MyScreen.h"  
  3. int main (int argc, const char * argv[]) {   
  4.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  5.     Screen *screen=[[MyScreen alloc] init];  
  6.     [screen onTouch];   
  7.     [screen release];   
  8.     [pool drain];   
  9.     return 0;   

這里發現增加了個MyScreen 類。它繼承自Screen類。這里的代碼不再設置delegate屬性,因為已經在MyScreen類的init方法中設置了。后面會看到。

Action協議沒有變化,只是增加了optional:

  1. #import <Cocoa/Cocoa.h> 
  2. @protocol Action <NSObject> 
  3. @optional   
  4. - (void) doAction;  
  5. @end 

Screen類,可以看作抽象類,它主要供繼承使用,來復用委托模式的代碼。頭文件:

  1. #import <Foundation/Foundation.h>   
  2. #import "Action.h"  
  3. @interface Screen : NSObject <Action> {   
  4.     id <Action> delegate;   
  5. }  
  6. @property(nonatomic,retain) id <Action> delegate;  
  7. - (void) onTouch;  
  8. @end  

實現文件:

  1. #import "Screen.h"  
  2. @implementation Screen  
  3. @synthesize delegate;  
  4. - (void) onTouch{   
  5.     NSLog(@"on touch …");   
  6.     if ([delegate conformsToProtocol:@protocol(Action)] &&   
  7.         [delegate respondsToSelector:@selector(doAction)]) {   
  8.         [delegate performSelector:@selector(doAction)];   
  9.     }   
  10.     NSLog(@"on touched.");   
  11. }  
  12. @end 

這里不再實現doAction方法。

下面看MyScreen類的頭文件:

  1. #import <Cocoa/Cocoa.h>   
  2. #import "Screen.h"  
  3.  
  4. @interface MyScreen : Screen {  
  5. }  
  6. @end 

MyScreen類的實現文件:

  1. #import "MyScreen.h"  
  2. @implementation MyScreen  
  3. - (id) init{   
  4.     if (self=[super init]) {   
  5.         delegate=self;   
  6.     }   
  7.     return self;   
  8. }  
  9. - (void) doAction{   
  10.     NSLog(@"Bang!!!!!!!!!");   
  11. }  
  12. @end 

用類別實現委托模式

可以使用類別(Category)實現委托模式。還是上面的例子。下面使用Category實現了個示例。

main方法:

  1. int main (int argc, const char * argv[]) {   
  2.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  3.  
  4.     Screen *screen=[[Screen alloc] init];  
  5.     [screen onTouch];   
  6.     [screen release];    
  7.     [pool drain];   
  8.     return 0;   

Screen類的頭文件:

  1. #import <Foundation/Foundation.h> 
  2. @interface Screen : NSObject {   
  3.     id delegate;   
  4. }  
  5. @property(nonatomic,retain) id delegate;  
  6. - (void) onTouch;  
  7. @end 

在這個示例中,實際上property沒有起什么作用。

實現文件:

  1. #import "Screen.h"  
  2. @implementation Screen  
  3. @synthesize delegate;  
  4. - (id) init{   
  5.     if (self=[super init]) {   
  6.         delegate=self;   
  7.     }   
  8.     return self;   
  9. }  
  10. - (void) onTouch{   
  11.     NSLog(@"on touch …");   
  12.     if ([delegate respondsToSelector:@selector(doAction)]) {   
  13.         [delegate performSelector:@selector(doAction)];   
  14.     }   
  15.     NSLog(@"on touched.");   
  16. }  
  17. @end  

寫到這里,如果運行代碼,只會打印類似下面的日志:

  1. 2011-05-26 10:37:30.843 DelegateDemo[5853:a0f] on touch …   
  2. 2011-05-26 10:37:30.846 DelegateDemo[5853:a0f] on touched. 

下面寫Category代碼,名稱為ScreenAction,它的頭文件:

  1. #import <Cocoa/Cocoa.h>   
  2. #import "Screen.h"  
  3. @interface Screen (ScreenAction)   
  4. - (void) doAction;  
  5. @end 

實現文件:

  1. #import "ScreenAction.h"  
  2. @implementation Screen (ScreenAction)  
  3.  
  4. - (void) doAction{   
  5.     NSLog(@"BANG!!!!!!");   
  6. }  
  7. @end 

實現了這部分代碼再執行:

  1. 2011-05-26 10:37:30.843 DelegateDemo[5853:a0f] on touch …   
  2. 2011-05-26 10:37:30.846 DelegateDemo[5853:a0f] BANG!!!!!!   
  3. 2011-05-26 10:37:30.846 DelegateDemo[5853:a0f] on touched. 

小結:Objective-C學習之路 委托模式的內容介紹完了,希望本文對你有所幫助。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-07-25 13:05:37

Objective-C 委托

2011-07-25 10:30:41

Objective-C Xcode 重構

2011-07-25 11:02:29

Objective-C Xcode 標簽

2011-07-25 10:14:13

Objective-C Xcode

2011-08-03 15:51:48

Objective-C 協議 委托

2011-08-15 14:32:42

Objective-C委托協議

2011-05-11 14:06:49

Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2013-08-21 14:57:42

objective-c問題

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-10 18:07:29

Objective-C反射

2013-03-26 10:35:47

Objective-C單例實現

2011-08-15 17:06:01

Objective-CNSLog

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2011-07-06 14:41:34

Objective-C

2013-06-20 10:40:32

Objective-C實現截圖

2013-03-27 12:54:00

iOS開發Objective-C

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2011-08-15 16:09:44

Cocoa對象Objective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产美女视频黄 | 天天操天天摸天天干 | 午夜视频一区二区 | 久久精品国产亚洲一区二区 | 逼逼网 | 欧美一级毛片在线播放 | 麻豆av片 | 天天综合久久 | 国产精品中文字幕一区二区三区 | 男女激情网| 免费不卡视频 | 久久精品亚洲精品国产欧美 | 99久久视频| 欧美色综合一区二区三区 | 精品福利在线 | 紧缚调教一区二区三区视频 | 中文av电影 | 国产精品亚洲一区二区三区在线观看 | 亚洲va欧美va人人爽午夜 | 国产精品久久 | 日韩亚洲欧美综合 | 国产在线观看不卡一区二区三区 | 欧美成人手机视频 | 99久热 | 日本不卡视频在线播放 | 国产黄色麻豆视频 | 日本三级做a全过程在线观看 | 国产97色| 日韩精品一区二区三区在线播放 | 91精品国产91久久久久青草 | 日日摸天天添天天添破 | 特级黄一级播放 | 在线视频一区二区三区 | 一本综合久久 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 伊人春色成人网 | www.玖玖玖 | 欧美 日韩 亚洲91麻豆精品 | 国产乱性 | 国产一区二区影院 | av网站免费在线观看 |