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.帶行參...