您的位置:首页 > 移动开发 > IOS开发

iOS Block之皮毛

2015-09-11 09:17 267 查看
简单使用:

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: