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;
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;
相关文章推荐
- iOS 生成静态库.a文件
- licode的ios最新版本的接入
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
- iOS宏定义的使用与规范
- 【读书笔记】iOS-垃圾回收
- IOS学习笔记之获取Plist文件读取数据
- 【读书笔记】iOS-垃圾回收
- ios 控件代码transform学习笔记
- 【转载】iOS堆和栈的理解
- iOS系统 越狱系统还原(平刷)
- IOS中Json解析的四种方法
- 蓝懿iOS培训日志8 控件学习2
- iOS学习笔记-精华整理
- iOS-多线程-内存管理
- 视图旋转 AVPlayer视频播放视图旋转
- iOS应用性能调优的25个建议和技巧
- iOS-常见问题
- igrimaceV8.0.0 IG 一键新机 陌陌 Uber优步打针 平安易贷 滴滴 一号专车 饿了么 ios8 V8 ZTN(插件安装方式)
- Nagios+cacti的安装
- iOS开发textField点击背景空白隐藏收起键盘的N种方法