iOS 的 Block 的使用

2022-09-13 07:24:09 字數 1679 閱讀 6648

block 是一種資料型別,用來存**--用來儲存一段**,想用**的時候就呼叫這段**

使用場景:

1. 動畫

2. 多執行緒

3. 集合遍歷

4. 網路請求**

區別於函式:

函式也是用來儲存一段**的,當呼叫函式的時候才會執行裡面的**.

但是函式不能在程式執行的時候再在指定的位置執行**.

1. 沒引數也沒返回值的block

void (^gm)() = ^;  //gm是block變數的變數名,用來儲存這一段**

gm();  //執行block**

2. 有引數沒有返回值的block

void (^gm)(int) = ^(int count);//列印指定行數的...

gm(5); 

3. 有引數也有返回值的block

int (^sum)(int ,int ) = ^(int a, int b);//求兩個數的和

int c = sum(2,3);

typedef

typedef  舊  新 ;//用來簡化型別的名稱 . 用typedef 給block的型別 定義乙個別名;

1. typedef int(^myblock)(int, int); //myblock   <=>   int(^) (int, int);

2. myblock    minus = ^ (int a,int b);

等價於1,2  (int) (^minus)(int ,int ) = ^(int a,int b);

block 的使用場景:

當乙個函式的的**的前邊和後邊的**都一樣,就是中間的**有區別.可以將中間的**封裝成block的**,作為函式的引數.每次呼叫函式的時候,動態的將**傳進去.

block不能傳空nil,會造成壞訪問.需要加上判斷.

void gotwork(void (^work))

nslog(@"begin");

if (work != nil)   //**

work();

nslog(@"end");

block 呼叫外部的變數:

1. block能訪問外部的變數

2. 預設情況下,block裡面不能修改外面的區域性變數

如果要修改可以在 外部的變數前加 __block

補充:typedef void (^myblock)() ;

@inte***ce person

@property(nonatomatic, copy) myblock  block;

-(void) run;

@end 

person * p = [[person alloc] init];

p.block = ^;//如果block是copy,那麼p釋放不了

或者改為:__weak typeeof(p) weakp = p; p.block = ^;

如把@property(nonatomatic, weak) myblock  block;//改為weak,那麼p可以釋放掉

如果沒有對block行copy造作,block就儲存於棧空間

如果對block進行copy操作,block就儲存於堆空間

如果block儲存於棧空間,不會對block內部所用到的物件產生強引用.

如果block儲存於堆空間,就會對block內部所用到得物件產生強引用.

IOS中Block的使用

block的宣告 1,void myblock 2,int myblock float,int 3,nsstring myblock int,nsstring 也可以使用typedef為block定義別名。三種block的特性 block是乙個object物件,所以我們需要對它進行記憶體管理。blo...

iOS開發中block的使用

block簡介 block的實際行為和function很像,最大的差別是在可以訪問同乙個scope的變數值。block實體形式如下 傳入引數列 block實體開頭是 接著是由小括號所包起來的引數列 比如 int a,int b,int c 行為主體由大括號包起來,專有名字叫做block litera...

iOS中block的定義和使用

1.block可以用來儲存一段 或者用來封裝一段 段,塊。2.block的標誌是 3.block跟函式很像 可以儲存 可以有返回 值 也可以有行參 呼叫方式一樣 4.定義乙個block pragma mark 不帶引數的block void outputblock outputblock 5.帶行參...