delegate,block,notification三者的運用

簡介


網(wǎng)上對于delegate,block,notification運用都有介紹见芹,但都是介紹的用法薯定;我這里針對于懶人和一些基礎不太好的同學進一步補充介紹(是小demo實戰(zhàn))!

delegate是經(jīng)典設計模式也就是大部分的語言都可以實現(xiàn)的模式,delegate只是保存了一個對象指針夏伊,直接回調(diào)抹沪,沒有額外消耗刻肄。

block出棧需要將使用的數(shù)據(jù)從棧拷貝到堆融欧,當然對象的話就是加計數(shù)敏弃,使用完或者block置nil后才消除。所以我們用block時要進行弱引用:ARC下:__weak typeof(self) weakSelf = self;非ARC下:__block typeof(self) weakSelf = self;

notification 通知的用法相對就是比較簡單的噪馏,記茁蟮健:有添加就要有移除;


delegate用法:


1,定義一個vc(TestViewController)欠肾,在你定義的vc.h(TestViewController.h)中進行聲明

@protocol TestViewDelegate;
@interface TestViewController : UIViewController
@property(assign, nonatomic) id <TestViewDelegate> testViewDelegate;
@end
@protocol TestViewDelegate <NSObject>
-(void)selectedString:(NSString *)string;
@end
>

2,外部寫好delegate在調(diào)用隅要,在vc(TestViewController)引用TestViewDetegate.h ,之后和1一樣。

這里寫圖片描述

3董济,就是傳值了步清,在vc(TestViewController)定義一個button在其點擊方法中添加delegate的傳值

- (IBAction)back:(id)sender {
   if (self.testViewDelegate && [self.testViewDelegate respondsToSelector:@selector(selectedString:)]) {
      [self.testViewDelegate selectedString:@"T - T"];
   }
}

4,接收delete的傳值時,在你的第一個vc(SimonViewController)添加TestViewDelegate虏肾,如圖1; 點擊按鈕跳轉(zhuǎn)到(TestViewController)中廓啊,并對delegate賦self , 如圖1下面代碼;

這里寫圖片描述
- (IBAction)buttonClick:(id)sender {
    
  TestViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"TestView"];
   vc.testViewDelegate = self;
    
  [self.navigationController pushViewController:vc animated:YES];

}

5,接收到delete傳值處理

-(void)selectedString:(NSString *)string{
  [self.navigationController popViewControllerAnimated:YES];//返回上個頁面
  NSLog(@"string --- >%@",string);
}

 打臃夂馈:string --- >T - T

block用法:

1谴轮,block的聲明也是vc.h(TestViewController.h)中進行聲明,如下:

typedef void (^TestViewblock)(NSString *string);
@interface TestViewController : UIViewController
@property(nonatomic,strong)TestViewblock testViewBlock;
@end

2吹埠,在vc(TestViewController)定義一個button在其點擊方法中添加block的傳值

- (IBAction)back:(id)sender {
   if (_testViewBlock) {
      _testViewBlock(@"T - T");
   }
}

3,跳轉(zhuǎn)到vc(TestViewController)及block值處理:

- (IBAction)buttonClick:(id)sender {
- 
    TestViewController *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"TestView"];
    [self.navigationController pushViewController:vc animated:YES];
       __weak typeof(self) weakSelf=self;//避免block 循環(huán)緩存
       vc.testViewBlock=^(NSString *string){
            [weakSelf.navigationController popViewControllerAnimated:YES];//返回上個頁面
            NSLog(@"Block--->%@",string);
     };
}

打拥诓健:Block--->T - T

notification(通知)用法:

1,在vc(SimonViewController)的viewWillAppear添加通知疮装,為了避免重復添加我這里執(zhí)行了先移除再添加:

 -(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     [[NSNotificationCenter defaultCenter] removeObserver:self];//移除通知
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification:) name:@"test_notification" object:nil];//添加通知
}

2,在vc(TestViewController)點擊進行傳值

 - (IBAction)back:(id)sender {   
      [[NSNotificationCenter defaultCenter] postNotificationName:@"test_notification" object:@"T - T"];
   }

3,在vc(SimonViewController)接收通知處理

 -(void)notification:(NSNotification *)notification{
      NSString *sting = [notification object];
      NSLog(@"sting --->%@",sting);
 }
 
 打印:sting --->T - T

4,在vc(SimonViewController)的viewWillDisappear中移除通知粘都,通知移除后廓推,在vc(TestViewController)進行傳值,將不被接收處理翩隧;小伙伴們樊展,可以試試!

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];  
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堆生,一起剝皮案震驚了整個濱河市专缠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淑仆,老刑警劉巖涝婉,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔗怠,居然都是意外死亡墩弯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門蟀淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞澳,你說我怎么就攤上這事怠惶。” “怎么了轧粟?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵策治,是天一觀的道長。 經(jīng)常有香客問我兰吟,道長通惫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任混蔼,我火速辦了婚禮履腋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惭嚣。我一直安慰自己遵湖,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布晚吞。 她就那樣靜靜地躺著延旧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槽地。 梳的紋絲不亂的頭發(fā)上迁沫,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天芦瘾,我揣著相機與錄音,去河邊找鬼集畅。 笑死近弟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牡整。 我是一名探鬼主播藐吮,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逃贝!你這毒婦竟也來了谣辞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤沐扳,失蹤者是張志新(化名)和其女友劉穎泥从,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沪摄,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡躯嫉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杨拐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祈餐。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哄陶,靈堂內(nèi)的尸體忽然破棺而出帆阳,到底是詐尸還是另有隱情,我是刑警寧澤屋吨,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布蜒谤,位于F島的核電站,受9級特大地震影響至扰,放射性物質(zhì)發(fā)生泄漏鳍徽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一敢课、第九天 我趴在偏房一處隱蔽的房頂上張望阶祭。 院中可真熱鬧,春花似錦直秆、人聲如沸胖翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萨咳。三九已至,卻和暖如春疫稿,著一層夾襖步出監(jiān)牢的瞬間培他,已是汗流浹背鹃两。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舀凛,地道東北人俊扳。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像猛遍,于是被迫代替她去往敵國和親馋记。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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