iOS協議--CS193P課程筆記(1),
一. 引入protocal與delegate概念的目的
由於“id”類型的使用,無法通過id,獲得真正想傳遞或接收的資料類型(雖然可通過id的自省機制,在運行時詢問)。 因此我們在代碼中說明,想要這個id類型的對象實現哪些方法(文法上的定義,有無protocal,編譯器產生的程式碼是無區別的)。
id < Protocal > obj
聲明對象obj,是一個id類型的對象,並滿足某條件(Protocal)。
id < Protocal > obj =[ [MyClass alloc ]init ]
MyClass 承諾實現Protocal中的方法。
二. iOS中protocal的應用
1 delegate 和dataSourse
一個iOS中得對象,想完成某些重要的功能,和不屬於類方法的方法,則它會把這些事件的操作代理出去,由它的代理完成。為了達到對上述的目的,在此對象中聲明一個滿足一系列方法(protocal)的屬性,代表其代理。
1.1 可用於對子類中實現不屬於類方法的方法(This is an alternative to subclassing to provide non-generic behavior)
舉例:
1 // NetWorkManager.h 2 @protocol NetworkDelegate 3 @required 4 - (void)task:(NetWorkFlag)tag didSuccess:(NSDictionary *)result withInfo:(NSString *)infoString; //成功回調 5 - (void)task:(NetWorkFlag)tag didFailed:(NSString *)failedReason; //失敗回調 6 @optional 7 - (void)setProgress:(float)newProgress; 8 @end 9 @interface NetWorkManager : NSObject<ASIHTTPRequestDelegate>10 @property (nonatomic, weak) id<NetworkDelegate> networkDelegate;11 .....//其他類介面
上述代碼說明, NetWorkManager將其 didSuccess 與 didFailed 方法代理出去,由其代理 id<NetworkDelegate> networkDelegate實現。其中networkDelegate可以是任何類型(id)的對象,其承諾實現 @protocol NetworkDelegate。
1 //GetOrderController.h2 @interface GetOrderViewController : TTBaseViewController <UITableViewDelegate,UITableViewDataSource,UIAlertViewDelegate,NetworkDelegate>
1 // GetOrderController.m2 3 [self.networkManager setNetworkDelegate:self];
1.2 在對象(MVC)直接進行盲通訊
舉例:View無法擁有自己的資料,需要不斷詢問別的對象,進行通訊。而View不想與某一特定類型的對象綁定,所以該通訊對象最好是一個id(不可見)。
GetOrderController中有tableView屬性,用於展示列表資訊,即GetOrderController承諾實現dataSourse協議中得方法。此種情況下,tableView與GetOrderController的通訊(controller與view)即盲通訊(blind)。通訊內容在此處為 count和dataAt兩類。