object-c 協議(Protocols)和代理(Delegation)的學習

haibo wang發表於2014-04-10

代理是Object-C中的一個重要機制,他可以將物件導向程式設計的封裝特性進一步加強,不是自己負責的事情堅決不做,而是轉而讓對應的事情負責人(代理)去做。相反如果是自己需要負責的事情(作為別人的代理),會搶著去做。代理的引入真正意義上完全實現MVC的程式結構框架。

協議是對類的實現進行規約的一套標準,可以保證多個承諾實現協議的類的介面一致性。比如協議中定義了一個介面X,那承諾執行這個協議的類,就需要實現這個介面X.協議的關鍵性是讓大家都有法可依有據可查。Object-C中很多時候,協議和代理是一起出現一起使用的,我們可以通過協議和代理來進行類與類之間的通訊和交流。

抽象的描述,如果類A是類B的代理,那麼類B定義出一套他的代理需要實現的介面,這套東西以協議的方式提供給A,類A實現了協議的介面,也就可以收到類B要告知他的內容。

以下是複製別人的,看著不粗

今天看到一個哥們總結delegateprotocol關係用了這樣的一個比喻,覺得很貼切,拿來給大家分享一下:

      把自己不想幹的一些事情(洗衣做飯)找個助手來幫助你做,而你要的這個助手得有一定的能力,不是任何一個人都可以的,所以你就得有個招聘要求。好了,協議(protocol)就類似於你的招聘要求,你找到的助手就是代理(delegate)。  這樣就有了  我.delegate = 助手;好了,這樣以後再有洗衣做飯的活直接找助手做就可以了。

 

    協議不是類,以@protocol關鍵字宣告, 協議有兩個物件:代理者和委託者。

    代理者:實現協議的某個方法。

    委託者:用自己的方法制定要實現協議的方法的物件。

    協議的兩個預編譯指令@optional(/ˈɔpʃənl/):可以選擇的方法。@required:必須執行的方法。

 

寫個小例子:

協議:HelloworldDelegte.h

    @protocol HelloworldDelegate <NSObject>

    -(NSString *)getString;

    @end

委託類:

 ViewController.h

  #import "HelloworldDelegte.h"

  @interface ViewController:UIViewController

    @property(nonatimic)id<HelloWorldDelegate>delegate;

  @end 

ViewController.m

  -(void)viewDidLoad{

      SecondViewController *second = [[SecondViewController alloc]init];

      self.delegate = second;//指定代理物件second

      NSString *str = [self.delegate getString];//獲得代理方法的返回值。

  }

代理類:

  SecondViewController.h

  #import "SetStringDelegate.h"

  @interface SecondViewController:UITableBarController<SetStringDelegate>

  @end

  SecondViewController.h

  -(NSString *)setString{

      return @"helloWorld";

  }

簡單的代理回撥也可以把代理物件設定為自身,可以在自身中實現協議方法。

@protocol HelloWorldDelegte <NSObject>

   -(NSString *)setString;

@end

@protocol HelloWorldDelegate

@property(nonatomic,assign)id<HelloWorldDelegate>delegate;

-(NSString *)setString;

@end

 

@end

相關文章