Block基礎(chǔ)點總結(jié)

1.定義

  1. Block是OC中的一種數(shù)據(jù)類型,在iOS開發(fā)中被廣泛使用偎痛,是用來保存一段代碼
  2. ^是Block的特有標(biāo)志
  3. Block的實現(xiàn)代碼包含在{}之間
  4. 大多情況下旱捧,以內(nèi)聯(lián)inline函數(shù)的方式被定義和使用
  5. Block與C語言的函數(shù)指針有些相似,但使用起來更加靈活
    5.1) 可以保存代碼
    5.2) 有返回值
    5.3) 有形參

block的定義方式:
先寫^,然后寫返回值類型踩麦,接著是參數(shù)類型枚赡,參數(shù)名,然后是大括號谓谦,分號贫橙,大括號里面的代碼

//定義block
//返回值可以自己推斷出來是什么類型的
^int(int x,int y){
    return x + y
};
解釋:
^ : block的標(biāo)志:
第一個int:返回值類型;
int x:  第一個參數(shù)類型和參數(shù)名茁计;
int y:第二個參數(shù)類型和參數(shù)名料皇;
{}里面是我們想實現(xiàn)的某些功能,不能少了分號星压。

例如:

格式說明:
(返回類型)(^塊名稱)(參數(shù)類型) = ^(參數(shù)列表){
            代碼實現(xiàn)
}践剂;
//如果沒有參數(shù),等號后面參數(shù)列表的()可以省略
#無返回值娜膘,無參數(shù)
void(^demoBlock)() = ^void(){
     NSLog(@"hello world");
}();//在此加上小括號()就是block調(diào)用
或者
void(^demoBlock)() = ^{
    NSLog(@"hello world");
};
#無返回值逊脯,有參數(shù)
void (^sumBlock) (int,int) = ^(int x,int y){
       return x + y;
};
#有返回值,無參數(shù)
NSString(^demoBlock)() = ^NSString *(){
       return @"hello world";
};
#有返回值竣贪,有參數(shù)
int(^demoBlock)(int x,int y) = ^int(){
       return x * y;
};

2.常見相關(guān)面試題
block可以使用在定義之前聲明的局部變量:

int i = 10;
void(^myBlock)() = ^{
       NSLog(@"%d",i);
};
i = 100;//實際上并沒有效果
myBlock();

#輸出結(jié)果為:10

注意:
(1) 在定義Block時军洼,會在Block中建立當(dāng)前局部變量內(nèi)容的副本(拷貝)
(2) 后續(xù)再對該變量的數(shù)值進行修改,不會影響B(tài)lock中的數(shù)值
(3) 如果需要在block中保持局部變量的數(shù)值變化演怎,需要使用__block關(guān)鍵字
(4) 使用此關(guān)鍵字后匕争,同樣可以在Block中修改該變量的數(shù)值

3.當(dāng)做參數(shù)傳遞
Block可以被當(dāng)做參數(shù)直接傳遞:

NSArray *array = @[@"張三",@"李四",@"尼瑪",@"趙五"];
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%d %@",(int)idx,obj);
        if ([@"尼瑪" isEqualToString:obj]) {
            *stop = YES;
        }
    }];
#說明:遍歷并NSLog()array中的內(nèi)容,當(dāng)obj為“尼瑪”時停止遍歷

4.使用局部變量
在被當(dāng)做參數(shù)傳遞時爷耀,Block同樣可以使用在定義之前聲明的局部變量:

int stopIndex = 1;
    NSArray *arr = @[@"張三",@"李四",@"尼瑪",@"趙五"];
    [arr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"第%d項內(nèi)容是%@",(int)idx,obj);
        if ([@"尼瑪" isEqualToString:obj] || idx == stopIndex) {
            *stop = YES;
        }
    }];

注意:默認情況下甘桑,Block外部的變量,在Block中是只讀的

BOOL flog = NO;;
    NSArray *ar = @[@"張三",@"李四",@"尼瑪",@"趙五"];
    [ar enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        if ([@"尼瑪" isEqualToString:obj] || idx == stopIndex) {
        *stop = YES;
        flog = YES; //編譯錯誤 爆紅了
      }
    }];

5.__block關(guān)鍵字
如果需要修改Block之外的局部變量跑杭,需要使用這個關(guān)鍵字

__block BOOL flog = NO;
    NSArray *ar = @[@"張三",@"李四",@"尼瑪",@"趙五"];
    [ar enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
          if ([@"尼瑪" isEqualToString:obj] || idx == stopIndex) {
        *stop = YES;
        flog = YES; //現(xiàn)在可以修改了C薄!5铝隆爹橱!
      }
    }];
提示:無需使用__block關(guān)鍵字,在塊代碼中可以修改成員變量的數(shù)值(比較少用)

6.傳遞對象
對象傳遞進Block的方式

NSString *stopName = @"尼瑪";
    NSArray *nameArr = @[@"張三",@"李四",@"尼瑪",@"趙五"];
    [nameArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"第%d項內(nèi)容是%@",(int)idx,obj);
        if ([stopName isEqualToString:obj] || idx == stopIndex) {
            *stop = YES;
        }
    }];

為保證Block中代碼正常運行窄做,在stopName的指針傳遞Block時愧驱,Block會自動對stopName的指針做強引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浸策,隨后出現(xiàn)的幾起案子冯键,更是在濱河造成了極大的恐慌惹盼,老刑警劉巖庸汗,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異手报,居然都是意外死亡蚯舱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門掩蛤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枉昏,“玉大人,你說我怎么就攤上這事揍鸟⌒至眩” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵阳藻,是天一觀的道長晰奖。 經(jīng)常有香客問我,道長腥泥,這世上最難降的妖魔是什么匾南? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蛔外,結(jié)果婚禮上蛆楞,老公的妹妹穿的比我還像新娘。我一直安慰自己夹厌,他們只是感情好豹爹,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著矛纹,像睡著了一般臂聋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天逻住,我揣著相機與錄音钟哥,去河邊找鬼。 笑死瞎访,一個胖子當(dāng)著我的面吹牛腻贰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扒秸,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼播演,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伴奥?” 一聲冷哼從身側(cè)響起写烤,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拾徙,沒想到半個月后洲炊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡尼啡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年暂衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崖瞭。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狂巢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出书聚,到底是詐尸還是另有隱情唧领,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布雌续,位于F島的核電站斩个,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏西雀。R本人自食惡果不足惜萨驶,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艇肴。 院中可真熱鬧腔呜,春花似錦、人聲如沸再悼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冲九。三九已至谤草,卻和暖如春跟束,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丑孩。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工冀宴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人温学。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓略贮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仗岖。 傳聞我的和親對象是個殘疾皇子逃延,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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