簡單的代碼總結,不足之處多多指教。
//簡單的使用 -(void)blockOne{ int number=23; int(^BlockOne)(int) = ^(int num2) { return number*num2; }; NSLog(@"輸出的block %d",BlockOne(2)); } -(void)blockTwo{ int(^block)(int,int) = ^(int stra,int str2) { return stra + str2; }; NSLog(@"這是第二個啊 %d",block(2,3)); } -(void)blockThree{ //下邊這個代表Block 會匯創輸入的 平方根(int a 就是參數咧,return a*a ; 就是行為主體)。記得主題后邊要加“;” 因為是敘述,而整個{} 后邊也要加“;” 因為Block 是個物件實體 //小括號里邊的3 會被當成 輸入值然后由block輸出3*3=9 致電該給reblock 這個變數 int reblock = ^(int a){ return a*a;}(3); NSLog(@"reblock %d",reblock); //上邊的簡單方法 回傳值 (^名字)(參數列); int (^square)(int); //有一個 square 的Block Pointer 其所指向的Block 是有一個int 輸入 和輸出 square = ^(int a){return a*a;};//將剛才的實體 制定給square //使用 NSLog(@"輸出square 的 平方%d",square(2)); }
Block中變量的值在函數內外的變化
-(void)blockPointer{ #define mark 變量的變化 是否可以改變其值 // 1 未加修飾 Block 外改變outA后 不改變最后結果 int outA = 8;
int(^myPtr)(int) = ^(int a) { return outA + a; }; outA = 10;
//去與 block 在同一個作用域中值
int result = myPtr(3);
NSLog(@"block 外改變 outA的值為10后 會是13嘛 %d",result); ///這個值在進行到 block中時 第一次 會copy 到block中去,下次再用直接用copy值,其值之后辯護啊 對其都不會有影響 指的是變數的值; 如果是一個pointer指針的話,它的值是可以在block 里變化的 // 2 __block 修飾后 其外改變,可以改變 在其內改變 ,可以改變 //外部改變 __block int outB = 8;
int(^myPtrB)(int) = ^(int b) {
return outB + b; }; outB = 10;
//去與 block 在同一個作用域中值 int resultB = myPtrB(3); NSLog(@"block 外改變 outB的值為10后 會是13嘛 %d",resultB); //block 內部改變 __block int outC = 8; int(^myPtrC)(int) = ^(int c) { outC = 10; return outC + c; }; NSLog(@"block 內部 變 outC的值為10后 會是13嘛 %d",myPtrC(3)); }
#define mark static 修飾變量的時候值的變化 // 用staic 修飾是的改變 因為outC是個static 變數會直接反應其值 -(void)blockStaticChange{ // 2 __block 修飾后 其外改變,可以改變 在其內改變 ,可以改變 //外部改變 static int outB = 8; int(^myPtrB)(int) = ^(int b) { return outB + b; }; outB = 10; //去與 block 在同一個作用域中值 int resultB = myPtrB(3); NSLog(@"static 外改變 outB的值為10后 會是13嘛 %d",resultB); //block 內部改變 static int outC = 8; int(^myPtrC)(int) = ^(int c) { outC = 10; return outC + c; }; NSLog(@"static 內部 變 outC的值為10后 會是13嘛 %d",myPtrC(3)); }