iOS的擴(kuò)展&代理&通知


擴(kuò)展(Extension)

一般用擴(kuò)展來做什么?

1.聲明私有屬性,是可以不對子類暴露的。
2.聲明私有方法,方便閱讀。
3.聲明私有成員變量析命。

擴(kuò)展的特點(diǎn):

1.編譯時(shí)決議。
2.只以聲明的形式存在,沒有具體實(shí)現(xiàn),多數(shù)情況寄生于宿主類的.m中,也就是說,它不是獨(dú)立存在實(shí)現(xiàn)的一個(gè)文件逃默,可以把擴(kuò)展理解為類的一個(gè)內(nèi)部的私有聲明鹃愤。
3.不能為系統(tǒng)類添加擴(kuò)展。

分類和擴(kuò)展的區(qū)別:

1.分類是運(yùn)行時(shí)決議,擴(kuò)展是編譯時(shí)決議笑旺。
2.分類可以有聲明有實(shí)現(xiàn),而擴(kuò)展只有聲明,它的實(shí)現(xiàn)是直接寫在宿主類當(dāng)中。
3.可以為系統(tǒng)類添加分類,但不能為系統(tǒng)類添加擴(kuò)展馍资。

代理(Delegate):

什么是代理:

1.準(zhǔn)確的說是一種軟件設(shè)計(jì)模式筒主,代理模式.
2.iOS當(dāng)中以@protocol形式體現(xiàn).
3.傳遞方式是一對一.
代理的工作流程:


1.委托方會(huì)要求代理放需要實(shí)現(xiàn)的接口,全部定義在協(xié)議當(dāng)中鸟蟹。
2.在協(xié)議當(dāng)中可以聲明屬性乌妙,也可以聲明方法。
3.代理會(huì)按照協(xié)議實(shí)現(xiàn)方法建钥。
4.代理會(huì)返回一個(gè)處理結(jié)果給委托方藤韵。
5.委托方需要調(diào)用代理方遵從的協(xié)議方法。

首先定義一個(gè)協(xié)議類熊经,來定義公共協(xié)議

#import <Foundation/Foundation.h>
@protocol LoginProtocol <NSObject>
@optional
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password;
@end

定義委托類泽艘,這里簡單實(shí)現(xiàn)了一個(gè)用戶登錄功能欲险,將用戶登錄后的賬號(hào)密碼傳遞出去,由代理來處理具體登錄細(xì)節(jié)匹涮。

#import <UIKit/UIKit.h>
#import "LoginProtocol.h"
/**
 *  當(dāng)前類是委托類天试。用戶登錄后,讓代理對象去實(shí)現(xiàn)登錄的具體細(xì)節(jié)然低,委托類不需要知道其中實(shí)現(xiàn)的具體細(xì)節(jié)喜每。
 */
@interface LoginViewController : UIViewController
// 通過屬性來設(shè)置代理對象
@property (nonatomic, weak) id<LoginProtocol> delegate;
@end
 
實(shí)現(xiàn)部分:
 
@implementation LoginViewController
- (void)loginButtonClick:(UIButton *)button {
  // 判斷代理對象是否實(shí)現(xiàn)這個(gè)方法,沒有實(shí)現(xiàn)會(huì)導(dǎo)致崩潰
  if ([self.delegate respondsToSelector:@selector(userLoginWithUsername:password:)]) {
      // 調(diào)用代理對象的登錄方法雳攘,代理對象去實(shí)現(xiàn)登錄方法
      [self.delegate userLoginWithUsername:self.username.text password:self.password.text];
  }
}

代理方带兜,實(shí)現(xiàn)具體的登錄流程,委托方不需要知道實(shí)現(xiàn)細(xì)節(jié)吨灭。

// 遵守登錄協(xié)議
@interface ViewController () <LoginProtocol> 
@end
 
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
 
    LoginViewController *loginVC = [[LoginViewController alloc] init];
    loginVC.delegate = self;
    [self.navigationController pushViewController:loginVC animated:YES];
}
 
/**
 *  代理方實(shí)現(xiàn)具體登錄細(xì)節(jié)
 */
- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password {
    NSLog(@"username : %@, password : %@", username, password);
}

這里我們需要知道一下刚照,協(xié)議中可以定義哪些內(nèi)容?協(xié)議可以通過@required定義必須實(shí)現(xiàn)的代理方法沃于,通過@optional定義可選方法涩咖。


在我們實(shí)際開發(fā)中,委托方和代理方的關(guān)系應(yīng)該怎么樣建立繁莹,他們建立的關(guān)系的過程中檩互,應(yīng)該注意哪些問題?

在使用代理的時(shí)候咨演,存在一個(gè)循環(huán)引用的問題闸昨,當(dāng)代理,協(xié)議薄风,委托都通過強(qiáng)引用(strong)形成一個(gè)閉環(huán)饵较,則會(huì)造成內(nèi)存泄露的問題,此時(shí)我們通常會(huì)讓委托方弱(weak)引用指向代理方來避免循環(huán)引用遭赂。

通知(NSNotification)

  • 使用觀察者模式來實(shí)現(xiàn)的循诉、用于跨層傳遞消息的機(jī)制(一般數(shù)據(jù)處理邏輯是網(wǎng)絡(luò)層傳遞到數(shù)據(jù)層,然后在經(jīng)過業(yè)務(wù)邏輯層加工再去更新UI撇他。如果有時(shí)候網(wǎng)絡(luò)層返回的數(shù)據(jù)不經(jīng)過業(yè)務(wù)邏輯層茄猫,直接到達(dá)UI層,這時(shí)候就用到跨層傳遞)困肩。
  • 傳遞方式為一對多划纽。

通知和代理的區(qū)別:

  • 通知是觀察者模式來實(shí)現(xiàn),代理是由代理模式實(shí)現(xiàn)的锌畸。
  • 通知傳遞方式是一對多勇劣。代理是傳遞方式是一對一。

如何實(shí)現(xiàn)通知機(jī)制潭枣?
首先比默,信息的傳遞就依靠通知(NSNotification)幻捏,也就是說,通知就是信息(執(zhí)行的方法退敦,觀察者本身(self),參數(shù))的包裝粘咖。通知中心(NSNotificationCenter)是個(gè)單例,向通知中心注冊觀察者侈百,也就是說瓮下,這個(gè)通知中心有個(gè)集合,這個(gè)集合存放著觀察者钝域。
那么這個(gè)集合是什么樣的數(shù)據(jù)類型 讽坏? 大概猜想: 發(fā)送通知需要name參數(shù),添加觀察者也有個(gè)name參數(shù)例证,這兩個(gè)name一樣的時(shí)候路呜,當(dāng)發(fā)送通知時(shí)候,觀察者對象就能接受到信息织咧,執(zhí)行對應(yīng)的操作胀葱。猜想這個(gè)集合是NSDictionary
key就是name笙蒙,value就是NSArray(存放數(shù)據(jù)模型)抵屿,里面存放觀察者對象。如下圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捅位,一起剝皮案震驚了整個(gè)濱河市轧葛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艇搀,老刑警劉巖尿扯,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焰雕,居然都是意外死亡衷笋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門矩屁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辟宗,“玉大人,你說我怎么就攤上這事档插÷眩” “怎么了亚再?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵郭膛,是天一觀的道長。 經(jīng)常有香客問我氛悬,道長则剃,這世上最難降的妖魔是什么耘柱? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮棍现,結(jié)果婚禮上调煎,老公的妹妹穿的比我還像新娘。我一直安慰自己己肮,他們只是感情好士袄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谎僻,像睡著了一般娄柳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艘绍,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天赤拒,我揣著相機(jī)與錄音,去河邊找鬼诱鞠。 笑死挎挖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的航夺。 我是一名探鬼主播蕉朵,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼敷存!你這毒婦竟也來了墓造?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤锚烦,失蹤者是張志新(化名)和其女友劉穎觅闽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮俄,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛉拙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彻亲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孕锄。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖苞尝,靈堂內(nèi)的尸體忽然破棺而出畸肆,到底是詐尸還是另有隱情,我是刑警寧澤宙址,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布轴脐,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏大咱。R本人自食惡果不足惜恬涧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碴巾。 院中可真熱鬧溯捆,春花似錦、人聲如沸厦瓢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煮仇。三九已至碳锈,卻和暖如春舔示,著一層夾襖步出監(jiān)牢的瞬間滥嘴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工监憎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绞呈,地道東北人贸人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像佃声,于是被迫代替她去往敵國和親艺智。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容