在上篇中,簡單介紹了委託如何?,在Core
Location架構中,委託與協議共同使用,實現了對象間解耦及靈活性的問題,現在在上一份代碼的基礎上,新增加一個協議,即ManagerDelegate,此協議只有一個方法decideFrameDescription,這就構成了一個委託機制(delegation)(設計模式的一種)。
代碼(點擊這裡下載)
//環境
//Mac OS X 10.3.7
//Xcode Version 4.3.2 (4E2002) 為了IOS 5.1 升級了新版本的xcode
//代碼中NSObject *可以用id類型替換
#import <Foundation/Foundation.h>@protocol ManagerDelegate <NSObject> //協議- (BOOL) decideFrameDescription;@end
通過Delegate實現此協議,即
@interface Delegate : NSObject<ManagerDelegate>//綁定MangerDelegate@property NSInteger number;-(id)init;@end
#pragma mark-#pragma mark ManagerDelgate//實現協議-(BOOL) decideFrameDescription{ return NO; //通過return YES 或者 NO,來控制架構的描述}@end
最終架構會在根據使用者在Delegate中協議的描述,完成架構裡相應方法的變化,在本例中是
@implementation MyFrameWork@synthesize delegate,decide;- (NSString *) description{ if([self.decide decideFrameDescription]){ return (@"I am a MyFrameWork"); } else{ return (@"I am a decided MyFrameWork"); }}
在架構中需聲明協議接受的物件類型,如下
@protocol ManagerDelegate; //對協議聲明的引用@interface MyFrameWork : NSObject{}@property (nonatomic,assign)NSObject *delegate;//委派物件的指標,類型為NSObject,即一切objective-c類的父類@property (nonatomic,assign)id<ManagerDelegate> decide;//聲明需要接受實現了ManagerDelegate協議的對象- (id)init;- (void) callDelegate;@end
最終,我們通過在Delegate中實現ManagerDelegate協議,而架構通過decideFrameDescription的傳回值,實現了改變。像在Cocoa touch架構中,如果我們要使用一個picker(選取器),但架構不知道我們要的是幾個組件的picker和每個組件的內容,所以需要在我們的ViewControler中實現<UIPickerViewDelegate>和<UIPickerViewDataSource>.如果在numberOfComponentsInPickerView中返回2,完成numberOfRowsInComponent的組件選擇,完成UIPickerViewDataSource協議。
運行顯示效果如:
<此例為其他工程>