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
沒有留言:
張貼留言