iOS開發之protocol和delegate

峻峰飛陽發表於2016-09-11

protocol——協議
協議是用來定義物件的屬性,行為和用於回撥的。

協議中有兩個關鍵字@private和@optional,@private表示使用這個協議必須要寫的方法,@optional表示可選的方法,用不到可以不寫。

就像UITableView,它有兩個協議:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是規定行為操作的,裡面的方法都是可選的方
法,UITableViewDataSource是規定資料儲存結構的,有兩個必選方法。因此你再實現UITableViewDataSource時必須要定義這兩個方法,否則程式會出錯。

如果你使用了響應的類或者控制元件,如果該類定義了協議,就可以根據需要實現該協議。

protocol和java裡interface的概念類似,是Objective-C語法的一部分。
定義protocol如下
[cpp] view plain copy print?
@protocol ClassADelegate

  • (void)methodA;
  • (void)methodB;

@end

那麼就是定義了一組函式,這組函式放在一起叫作一個protocol,也就是協議。

函式是需要被實現的,所以如果對於class如下

[cpp] view plain copy print?
@interface ClassB {
}
@end

就叫作ClassB conform to protocol ClassADelegate,也就是說ClassB實現了這個協議,
也就是實現了這一組函式。

有了上面這個標頭檔案,我們就可以放心作呼叫

[cpp] view plain copy print?
ClassB *b = [[ClassB alloc] init];
[b methodA];
[b methodB];

而不用擔心出現unrecognized selector sent to instance這種錯誤了。

所以protocol就是一組函式定義,是從類宣告中剝離出來的一組定義。

[cpp] view plain copy print?
id b = …;
[b methodA];

這種用法也常見,b是一個id型別,它知道ClassADelegate這組函式的實現。

delegate——委託,代理

適用場合:類A呼叫類B, 當類B想回撥類A的方法的時候, 要用到delegate
要理解下面的程式碼的話, 要知道的一個知識點是 協議(protocal)

檔案:ClassA.h

import

import “ClassB.h”

@interface ClassA : NSObject
- (void)test;
@end

檔案:ClassA.m

import “ClassA.h”

@implementation ClassA

-(void)test{
ClassB *classB = [[ClassB alloc] init];
classB.delegate = self;

[classB actionOfClassB];

}

-(void)callback{
NSLog(@”這個方法會被類B呼叫”);
}
@end

檔案:ClassB.h

import

import “ClassB.h”

@implementation ClassB
@synthesize delegate;
-(void)actionOfClassB{
[delegate callback];
}
@end

相關文章