iOS常用的設計模式(傳值、監聽等)-代理、通知、KVO

代理的使用步驟

定義一份代理協議

協議名字的格式一般是:類名 + Delegate,比如UITableViewDelegate

設計代理的細節

?一般都是@optional(讓代理可以有選擇性去實現一些代理方法)

方法名一般都以類名開頭,比如- (void)scrollViewDidScroll:

一般都需要將對象本身傳出去,比如tableView的代理方法都會把tableView本身傳出去

必須要遵守NSObject協議(基協議)

比如@protocol XMGWineCellDelegate

聲明一個代理屬性

代理的類型格式:id<協議> delegate

@property (nonatomic, ?weak) id<XMGWineCellDelegate>?delegate;

設置代理對象

代理對象遵守協議,實現協議里面相應的方法

當控件內部發生了一些事情,就可以調用代理的代理方法通知代理

如果代理方法是@optional,那么需要判斷方法是否有實現,直接調用可能會報錯

if ( [self.delegate respondsToSelector:@selector(wineCellDidClickPlusButton: )] ) {? ?

[self.delegate wineCellDidClickPlusButton:self];

}

iOS監聽某些事件的方法

通知(NSNotificationCenter\NSNotification)

任何對象之間都可以傳遞消息.

使用范圍:

1個對象可以發通知給多個對象

1個對象可以接受多個對象發出的通知

要求:必須得保證通知的名字在發出和監聽時是一致的

KVO

僅僅是能監聽對象屬性的改變(靈活度不如通知和代理)

代理

使用范圍

1個對象只能設置一個代理(假設這個對象只有1個代理屬性)

1個對象能成為多個對象的代理

通知和代理的選擇

共同點

利用通知和代理都能完成對象之間的通信

(比如A對象告訴B對象發生了什么事情, A對象傳遞數據給B對象)

不同點

代理:1個對象只能告訴另1個對象發生了什么事情

通知:1個對象能告訴N個對象發生了什么事情

代理比通知規范

建議使用代理多于通知,能使用代理盡量使用代理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容