2012/3/5

BLOCK 的運用

C++有BLOCK的功能
Objective C 在iOS4之後也支援了此功能
簡單來說
block類似Anonymous function


EX1
int (^square) (int);//block 指標(回傳型傳,無則用void) 
square = ^(int a ) {
return a*a ;
};
int result=square(5);
NSLog(@"num:%u",result);//25
EX2
int outA=3;
int (^square2) (int);
square2 = ^(int a ) {
return outA*a ;
};
result=square2(5);
NSLog(@"num:%u",result);//15
EX3
outA=3;
int (^square3) (int);
square3 = ^(int a ) {
return outA*a ;//outA is a copy
};
outA=7;
result=square3(5);
NSLog(@"num:%u",result);//15
EX4
NSMutableArray *arr=[NSMutableArray arrayWithObjects:
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:5],
[NSNumber numberWithInt:7],nil];
NSLog(@"arr:%@",arr);//1,3,5,7
int (^square4) (int);
square4 = ^(int a) {
int v=[(NSNumber *)[arr objectAtIndex:[arr count]-1]intValue];//arr is Pointer
[arr removeLastObject];
return v*a;
};
outA=7;
result=square4(5);
NSLog(@"num:%u",result);//35
NSLog(@"arr:%@",arr);//1,3,5,nil
用法 __block 變數名稱;
通用使用block時,變數是以copy value的方式傳入
如果變數是一般的資料形態(int、bool、float…)
會以傳值的方式丟到block中運算


也就是在block 的過程鐘
變數的值改變了
外面的變數將不受影響 這時
如果在變數前加上_block
這可以讓變數在block中的改變
套用到外block的變數  
void (^myBlock)(int) = ^(int v) {
  v=v+1;
  NSLog(@"%i",v);
  v=v+1;
  NSLog(@"%i",v);
  v=v+1;
  NSLog(@"%i",v);
 };
 
 int a=3;
 NSLog(@"a:%i",a);
 myBlock(a);
 NSLog(@"%i",a);
 
 __block int b=4;
 NSLog(@"b:%i",b);
 myBlock(b);
 NSLog(@"%i",b);
執行結果
2012-03-20 15:04:45.911 BlockTest2[10412:207] a:3
2012-03-20 15:04:45.912 BlockTest2[10412:207] 4
2012-03-20 15:04:45.913 BlockTest2[10412:207] 5
2012-03-20 15:04:45.914 BlockTest2[10412:207] 6
2012-03-20 15:04:45.914 BlockTest2[10412:207] 3
2012-03-20 15:04:45.915 BlockTest2[10412:207] b:4
2012-03-20 15:04:45.915 BlockTest2[10412:207] 5
2012-03-20 15:04:45.916 BlockTest2[10412:207] 6
2012-03-20 15:04:45.917 BlockTest2[10412:207] 7
2012-03-20 15:04:45.917 BlockTest2[10412:207] 4

沒有留言: