日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

block学习笔记

發(fā)布時(shí)間:2024/10/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 block学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
block學(xué)習(xí)筆記

?

Blocks 是一個(gè)帶有自動(dòng)變量值的匿名函數(shù)

1 block語法

完整形式的block語法與一般c語言函數(shù)定義,有兩點(diǎn)不同

(1)沒有函數(shù)名

(2)帶有 "^"

c:

  int func(int a)

  {

    return a;

  }

block:

  ^int (int a)

  {

    return a;

  }

block語法的BN范式: ^返回類型 參數(shù)列表 表達(dá)式 ^ int (int count){...};

可以省略為?^ 參數(shù)列表 表達(dá)式^ (int count){...};

如果沒有參數(shù)可以省略為?^ 表達(dá)式^ {...};

?

2 block類型變量

c語言中函數(shù)指針表達(dá)方式:

int func(int count)

{...}

int (*funcptr)(int count);

?

block語法將"*" 換為 "^"

int (^blk)(int) = ^ (int count){...};

int (^)(int)為block類型 blk為變量名

?

賦值操作

int (^blk1)(int) = blk 將blk賦值給新變量blk1

?

為了方便記述可以用c中方法typedef來解決該問題

typedef int (^blt_t)(int); 定義了一個(gè)block類型

blt_t myBlock = ^(int count){...};

int (^myBlock)(int)?= ^(int count){...};

?

blt_t myBlock; =>?int (^myBlock)(int) ;

以上2個(gè)表達(dá)式是等價(jià)的.

注意:typedef int (^blt_t)(int); 和?int (^blt_t)(int); 不一樣前者是一個(gè)類型,后者是一個(gè)類型變量要區(qū)分

?

當(dāng)用于函數(shù)參數(shù)的時(shí)候可以以下方式:

1 -(void)setCallBack:(void (^)(int?data)) block

2?typedef int (^blt_t)(int);

? -(void)setCallBack:(blt_t) block

?

3 截獲自動(dòng)變量

前面介紹了匿名函數(shù),這節(jié)介紹什么是帶有自動(dòng)變量值。

在block表達(dá)式中截獲所有的自動(dòng)變量的值,即保存該自動(dòng)變量的瞬間值,即使改寫block中使用的自動(dòng)變量也不會(huì)影響block執(zhí)行時(shí)自動(dòng)變量的值。

? ? int n = 10;

? ? void (^testBlock)() = ^()

? ? {

? ? ? ? NSLog(@"block :%d", n);

? ? };

? ??n = 20;

? ? testBlock(n);

這里block截獲了n得瞬間值10,雖然在調(diào)用block之前修改了n的值,但是打印出來的還是10.

?

__block 說明符

想在block表達(dá)式中修改block以外的自動(dòng)變量,需要在該自動(dòng)變量前面加上__block說明符

? ? __block int?n =?10;

? ??void?(^testBlock)() = ^()

? ? {

? ? ? ??NSLog(@"block :%d", n);

? ? };

? ??n =?20;

? ? testBlock(n); 打印出來20.

?

4 OC對(duì)象瞬間值

int val = 0;

void (^blk)(void) = ^{val = 1;}; 如果在block中修改自動(dòng)變量會(huì)產(chǎn)生編譯錯(cuò)誤。

那如果用oc對(duì)象呢?

id array = [[NSArray alloc]init];

void (^blk)(void) = ^{

  id obj =?[[NSObject alloc]init];

  [array addObject:obj];

}

這是沒問題的,但是如果你要修改自動(dòng)變量array的值也會(huì)產(chǎn)生編譯錯(cuò)誤。這個(gè)有點(diǎn)像c語言中將一個(gè)const指針當(dāng)參數(shù)傳到函數(shù)中,雖然不能修改指針的值但是可以修改指針指向的值。

?

posted on 2015-05-19 08:38 城之內(nèi) 閱讀(...) 評(píng)論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/HypeCheng/p/4513563.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的block学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。