1. 程式人生 > >Objective-C回撥機制(delegate, protocol)

Objective-C回撥機制(delegate, protocol)

轉載:http://blog.sina.com.cn/s/blog_6545eb460100pyjy.html

Objective-C是隻支援單一繼承的,當需要建立一個類能表現多個類的特性時,需要採用與Java中很類似的稱為協議(Protocol)的方法。如同一個類a,一個類b,兩個類簽訂一個協議p,該p協議規定一個方法c,c的實現在b中,當a需要呼叫實現c時,並不呼叫類b,而是宣告一個id<p> delegate, 如同a掏出一份協議交給代理商,然後delegate會去找到b,讓其完成c這件事。這樣的呼叫更加乾淨,下面用一個例子具體說明一下:

     protocol用法:             @interface ClassA :ClassB<protocol1, protocol2>
     首先先來一個一般情況下的例子,宣告一個UIView類:             @interface myView  :UIView{             }             @end 之後再宣告一個protocol,字首為protocol,沒有方法的實現(實現要交給別的類去完成):            @protocol myViewDelegate             -(void) Fun1;             -(void) Fun2;            @end;  之後就是代理委託人拉,委託的宣告方式如下,我們要在ClassB內使用Fun1方法,但是不需要做宣告:           @interface ClassB :UIViewController<myViewDelegate>
          @end     ClassB實現:           @implement ClassB            -init{                  MyView *view = [[MyView alloc]init];                  view.delegate = self;                  self.view = view;            }            -(void)Fun1{            //dostuff,like change navigatorBar blablabla            }
          @end     那麼怎麼在ClassA中使用Fun1呢?需要在ClassA的宣告中新增:          @interface myView  :UIView{            id<myViewDelegate> delegate;    }          @property ...          @end    具體實現中時:          -doSth()           {            [delegate Fun1];           }