通過block在實際項目的使用場景來理解block

使用場景:點擊自定義cell中的一個按鈕歼捐,跳轉(zhuǎn)至其他控制器

碰到這樣的需求肯定第一想到的是使用delegate,接下來使用 block實現(xiàn)跳轉(zhuǎn)缔御,至于block怎么定義钥弯,用什么關(guān)鍵字修飾,為什么要用copy請移步簡書的其他文章休讳,謝謝!

testCell.h 定義一個帶參數(shù)的block

#import <UIKit/UIKit.h>
typedef void (^myblock)(id parameter);
@interface testCell : UITableViewCell

/**
 *  創(chuàng)建自定義的cell
 */
+(instancetype)cellWithTableView:(UITableView*)tableView;

/**
 *  定義block
 */
@property (nonatomic, copy) myblock testBlock;

@end````


## testCell.m 在按鈕點擊事件中調(diào)用block

  • (IBAction)didClickme:(id)sender {

    if (self.testBlock) {
    self.testBlock(@"點擊了我");
    }
    }```

控制器中實現(xiàn)跳轉(zhuǎn)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    testCell *cell = [testCell cellWithTableView:tableView];
    cell.testBlock = ^(NSString *log){
        NSLog(@"log = %@", log);
    };
    return cell;
}```


## 結(jié)論:程序運行之后,點擊cell上的按鈕尿孔,`就能輸出log信息點擊了我`

看似很完美的東西俊柔,其實里面包好各種細節(jié)問題筹麸,如果沒有弄清楚他的本質(zhì),可能以后在項目使用過程中會引發(fā)各種問題雏婶,說不定就崩潰物赶,或者block不執(zhí)行!接下來說說我的理解尚骄,****特別注意這是我個人的理解块差,說不定哪個大神看到了侵续,會噴飯倔丈,希望有什么不對的地方,提出來状蜗,我會及時修改需五,以免誤導(dǎo)別人****


問題:

### 1.為什么我在testCell.m調(diào)用block的時候,要`加一個判斷`轧坎,不這樣寫行不行宏邮?

### 2.為什么我一`點擊按鈕`,控制器里給block賦值的代碼`立馬就能反映`缸血?

我開始在思考的時候蜜氨,立馬就想到了通知,感覺跟通知很相似捎泻,通知的使用飒炎,就是先注冊,然后發(fā)送通知笆豁,通知一發(fā)送立馬就能收到信息郎汪,想想block內(nèi)部的機制,或許就是使用通知闯狱,kvo來實現(xiàn)的煞赢,后來查閱資料,并不是那么一回事照筑。

首先來看看block的定義

`typedef void (^myblock)(id parameter);`熟悉c語言的童鞋,`一看就明白凝危,這不跟c語言的函數(shù)很像嗎?`

void block(NSString *log)
{

};```

這就好理解了媒抠,其實在控制器里面的賦值代碼,其實就是一個變量保存了一個c語言的函數(shù)咏花,相當于cell.testBlock對象趴生,聲明實現(xiàn)了一個方法阀趴,

cell.testBlock = ^(NSString *log){
    NSLog(@"log = %@", log);
};

此時點擊cell中的按鈕苍匆,調(diào)用block其實就是調(diào)用了之前早就在控制器初始化的時候,賦值的c函數(shù)浸踩,self.testBlock(@"點擊了我")這一句代碼不就是c語言中調(diào)用方法嘛叔汁,這樣就能解釋問題2了

- (IBAction)didClickme:(id)sender {

    if (self.testBlock) {
       self.testBlock(@"點擊了我");
    }
}```


想必問題1也不需要我多解釋了吧检碗,有一個小插曲据块,前不久我在GitHub上下載了一個別人寫的第三方框架,`這個框架外面提供了一個block定義的屬性另假,返回的是一個字符串`怕犁。當我把這個框架拖到我們項目中边篮,然后在某個地方使用的時候奏甫,立刻就奔潰了,它的demo是沒有問題的阵子,`當時就很納悶了,后面我是在它的框架中改了一行`代碼款筑,說到這大家應(yīng)該清楚是什么代碼了吧,對杈湾,就是在調(diào)用block的時候,加了一個判斷漆撞,`就是為了防止崩潰`于宙,你外部都沒有給我賦值,創(chuàng)建c語言函數(shù)捞魁,我去哪里調(diào)用你的函數(shù),這就是問題1.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奉件,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子县貌,更是在濱河造成了極大的恐慌,老刑警劉巖煤痕,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塘匣,居然都是意外死亡兆解,警方通過查閱死者的電腦和手機跑揉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來历谍,“玉大人,你說我怎么就攤上這事望侈∮∈撸” “怎么了脱衙?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捐韩。 經(jīng)常有香客問我,道長瞧预,這世上最難降的妖魔是什么仅政? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮圆丹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辫封。我一直安慰自己玖瘸,他們只是感情好檀咙,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔑匣,像睡著了一般棕诵。 火紅的嫁衣襯著肌膚如雪裁良。 梳的紋絲不亂的頭發(fā)上校套,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天笛匙,我揣著相機與錄音侨把,去河邊找鬼妹孙。 笑死,一個胖子當著我的面吹牛蠢正,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笨触,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雹舀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葱跋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤稍味,失蹤者是張志新(化名)和其女友劉穎荠卷,沒想到半個月后模庐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體油宜,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡怜姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年疼燥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但狭。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撬即,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剥槐,到底是詐尸還是另有隱情,我是刑警寧澤粒竖,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站温圆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岁歉。R本人自食惡果不足惜膝蜈,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饱搏。 院中可真熱鬧,春花似錦备绽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至课舍,卻和暖如春他挎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背办桨。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工站辉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庵寞。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像脓鹃,于是被迫代替她去往敵國和親古沥。 傳聞我的和親對象是個殘疾皇子瘸右,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中太颤。。龄章。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,192評論 1 23
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫做裙、插件肃晚、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • 引言 最近在研究RAC的時候关串,發(fā)現(xiàn)絕大部分代碼實現(xiàn)如下所示: 可以發(fā)現(xiàn)是block嵌套使用拧廊,這是使用block實現(xiàn)...
    西木柚子閱讀 1,426評論 5 25
  • 夏夏的日語學(xué)習(xí)小心得 在繼前兩次自學(xué)日語失敗之后吧碾,今年暑假,我開始了第三次日語的自學(xué)滤港。嗯,屢敗屢戰(zhàn)溅漾。在...
    一半一夏閱讀 380評論 2 5