總結delegate和protocol關係拿來給大家分享一下:
- 把自己不想幹的一些事情(洗衣做飯)找個助手來幫助你做,而你要的這個助手得有一定的能力,不是任何一個人都可以的,所以你就得有個招聘要求。協議(protocol)就類似於你的招聘要求,你找到的助手就是代理(delegate)。 這樣就有了我.delegate = 助手;好了這樣以後再有洗衣做飯的活直接找助手做就可以了。
協議不是類,以@protocol關鍵字聲明, 協議有兩個對象:代理者和委託者。
- 代理者:實現協議的某個方法。
委託者:用自己的方法制定要實現協議的方法的對象。
- 協議的兩個預編譯指令@optional:可以選擇的方法。@required:必須執行的方法。
寫個小例子:
協議:MyDelegte.h
@protocol MyDelegate <NSObject>
-(NSString *)getString;
@end
// 委託類:
ViewController.h
#import "MyDelegte.h"
@interface ViewController:UIViewController
@property(nonatimic)id<MyDelegate>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 MyDelegte <NSObject>
-(NSString *)setString;
@end
@protocol MyDelegate
@property(nonatomic,assign)id<MyDelegate>delegate;
-(NSString *)setString;
@end
@end