2011年3月23日

objective-c:delegate

delegate應該可以翻成指派、委派
是我剛開始學objective-c比較難理解的東西
大概有觀念後就覺得拿來餵資料或其他十分的便利


常常會有A interface裡面宣告了interface B的狀況
然後B有一些工作會需要A的其他成員幫忙完成
假設A有成員C、D、E
然後B的一些函式會需要存取這些參數,甚至是函式,傳來傳去實在很麻煩
比如說在B的.m檔會有函式:
-(void)print{
[self printfC];
[self printDplusE];
}
但這些資料需要來自A
就會有B把這些存取過程委託給A用法,
首先B要先訂出一些protocol,告知哪些事情需要A幫忙,然後還需要定義一個delegate變數
這個宣告會在interfaceB的.h檔:
@interface interfaceB{
id delegate;
}
@property (nonatomic,assign) id Bdelegate;
@protocol
-(void) printC;
-(void) printDplusE;
@end
(protocol跟property的故事有空在寫)
B並不需要實做這兩個函式
而A就要在.h檔宣告他遵守這個protocol,可以幫B做這些事情
@interface interfaceA{
object *C,*D,*E;
interfaceB *b;
}
在A的.m檔就需要實做,不然會被警告
-(void) printC{
//把C印出來
}
-(void) printDplusE{
//把D跟E加起來然後印出來
}
最後在A的函式中需要delegate的地方宣告B的delegate,例如[b.delegate=self(這邊的self就是A)
如此一來當B執行到printC、printDplusE兩個函式的時候
就會跳到A這邊,交給A來執行了,A執行完後會把結果給B

3 則留言:

伍林森 提到...

谢谢 写的很清楚 我再研究下 我刚开始接触objective-c和ios开发

père 提到...

Thank you~

KY 提到...

感謝大大詳細的解釋!

不過大大最後面那個範例少了個@end!!!

@interface interfaceB{
id delegate;
}
@property (nonatomic,assign) id Bdelegate;
@end

@protocol
-(void) printC;
-(void) printDplusE;
@end