歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C的委托機制【附代碼】

Objective-C的委托機制【附代碼】

日期:2017/3/1 10:12:14   编辑:Linux編程

委托在IOS開發框架Cocoa Touch 中經常使用,其含義是一個類的對象要求委托對象執行它的某些操作。委托機制實際是種設計模式,通過此種機制,能降低對象間的耦合。還是不繼續說概念了,直接上定義代碼。

//環境

//Mac OS X 10.3.7

//Xcode Version 4.2.1

//使用的是Xcode的Command Line Tool工程,結果由命令行輸出

  1. @interface MyFrameWork : NSObject{
  2. }
  3. @property (nonatomic,assign)NSObject * delegate;//委托對象的指針,類型為NSObject,即一切objective-c類的父類
  4. - (id)init;
  5. - (void) callDelegate;
  6. @end
  1. #import "MyFrameWork.h"
  2. @implementation MyFrameWork
  3. @synthesize delegate;
  4. - (NSString *) description{
  5. return (@"I am MyFrameWork");
  6. }
  7. -(id) init{
  8. self = [super init];
  9. if (self){
  10. }
  11. return self;
  12. }
  13. -(void)callDelegate{
  14. //通過delegate指針訪問類Delegate的description方法
  15. NSString *string = [self.delegate description];
  16. //發現在最新版的編譯器裡面NSLog為了安全(支持ARC),只接受格式化的字符串,因為NSLog底層也是用printf來格式化輸出的。
  17. //NSLog(str); // warning
  18. // NSLog(@"%@", str); // solution
  19. // NSLog(str, nil); // solution
  20. NSLog(string,nil);
  21. }
  22. @interface Delegate : NSObject
  23. @property NSInteger number;
  24. -(id)init;
  25. @end
  26. #import "Delegate.h"
  27. @implementation Delegate
  28. @synthesize number;
  29. -(NSString *)description{
  30. self.number = self.number + 1;
  31. NSString *string = [[NSString alloc] initWithFormat:@"I am Delegate,%ld calls",self.number];
  32. return (string);
  33. }
  34. -(id)init{
  35. self = [super self ];
  36. if (self) {
  37. self.number =0;
  38. }
  39. return self;
  40. }
  41. @end

首先定義了兩個類,MyFrameWork類通過Delegate類完成訪問Delegate的description方法。很簡單便完成了委托,這也跟objective-c面向對象和靈活的特點相穩合,如果熟悉C++的童鞋,就會發現上述同樣的功能的比較難完成,C++沒有共同的父類,所以不存在一個指針可以指向任意的委托對象,這似乎是個不可解決的問題。但C++中有類的成員函數指針這一概念,具體的實現可以看一下 http://www.linuxidc.com/Linux/2012-08/68654.htm 這篇,多參數時實現的很巧妙。總之objective-c委托實現很簡單(大家不許偷笑),但很少會像上面的列子使用,一般應用到框架上,還會同時帶上協議,例如:

上圖為使用Core Location框架(移動設備定位)中,類及協議組成的委托。
Copyright © Linux教程網 All Rights Reserved