iOS Block之皮毛
简单使用:
int multiplier = 7;
int (^myblock)(int) = ^(int num) {
return multiplier * num;
};
NSLog(@"%d", myblock(3));// 21
使用block的快排:(字符串)
char *myCharacters[ 4 ] = { "92" , "23" , "34", "56"};
qsort_b(myCharacters, 4, sizeof(char *), ^int(constvoid *l, const void *r) {
char *left = *( char **)l;
char *right = *( char **)r;
return strncmp (left, right, 1 );
});
printf("%s %s %s %s \n\n", myCharacters[0], myCharacters[1], myCharacters[2], myCharacters[3]);// 23 34 56 92
使用block的快排:(数字)
int nums[4] = {3,1,7,9};
qsort_b(nums, 4, sizeof(int), ^int(const void *l, const void *r) {
int left = *(int *)l;
int right = *(int *)r;
return left - right;
});
for (int i = 0; i < 4; i++) {
printf("%d ", nums[i]);// 1 3 7 9
}
一般来说,在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词,以上面第一个例子中的 multiplier 来说,这个变数在 block 中是唯读的,所以 multiplier = 7 指定完后,在 block 中的 multiplier 就只能是 7 不能修改,若我们在 block 中修改 multiplier ,在编辑时就会产生错误,因此若想要在 block 中修改 multiplier ,就必须在 multiplier 前面加上 __block 的修饰词,请参考下面的范例:
__block int multiplier = 7;
int (^myblock)(int) = ^(int num) {
multiplier += 5;
return multiplier * num;
};
NSLog(@"%d %d", myblock(3), multiplier);// 36 12
Block的几种定义
/* 回传void ,参数也是void 的block*/
void (^blockReturningVoidWithVoidArgument)( void );
/* 回传整数,两个参数分别是整数和字元型态的block*/
int (^blockReturningIntWithIntAndCharArguments)( int , char );
/* 回传void ,含有10 个block 的阵列,每个block 都有一个型态为整数的参数*/
void (^arrayOfTenBlocksReturningVoidWinIntArgument[ 10 ])( int );
Block变量
// 加上__block 修饰词,所以可以在block 中被修改。
__block int x = 123 ;
void (^printXAndY)( int ) = ^( int y)
{
x = x + y;
printf ( "%d %d\n" , x, y);
};
// 将会印出579 456
printXAndY( 456 );
//x 将会变成 579;

浙公网安备 33010602011771号