代理是Object-C中的一個重要機制,他可以將物件導向程式設計的封裝特性進一步加強,不是自己負責的事情堅決不做,而是轉而讓對應的事情負責人(代理)去做。相反如果是自己需要負責的事情(作為別人的代理),會搶著去做。代理的引入真正意義上完全實現MVC的程式結構框架。
協議是對類的實現進行規約的一套標準,可以保證多個承諾實現協議的類的介面一致性。比如協議中定義了一個介面X,那承諾執行這個協議的類,就需要實現這個介面X.協議的關鍵性是讓大家都有法可依有據可查。Object-C中很多時候,協議和代理是一起出現一起使用的,我們可以通過協議和代理來進行類與類之間的通訊和交流。
抽象的描述,如果類A是類B的代理,那麼類B定義出一套他的代理需要實現的介面,這套東西以協議的方式提供給A,類A實現了協議的介面,也就可以收到類B要告知他的內容。
以下是複製別人的,看著不粗
今天看到一個哥們總結delegate和protocol關係用了這樣的一個比喻,覺得很貼切,拿來給大家分享一下:
把自己不想幹的一些事情(洗衣做飯)找個助手來幫助你做,而你要的這個助手得有一定的能力,不是任何一個人都可以的,所以你就得有個招聘要求。好了,協議(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