Objective-C Block基本用法
来源:互联网 发布:淘宝店铺查封怎么处理 编辑:程序博客网 时间:2024/05/18 03:37
Objective-C Block基本用法
1. 代码块的声明和赋值
首先说一下普通变量的声明语法:
int num; // 声明一个变量,变量名为num, 语法为: 数据类型 变量名;num = 10; // 给变量赋值 语法为: 变量名 = 值;
再说代码块声明和赋值前先给出一个示例:
// 声明一个代码块变量,变量名为:myBlock 语法为:返回值(^变量名)(参数列表)int (^myBlock)(int); // 给代码块变量myBlock赋值 语法为: 变量名 = ^(参数列表){ // 代码块体}myBlock = ^(int num){ return num * 10;};
代码块变量的声明和普通变量的声明语法不一样,代码块的声明语法就像一个函数的定义一样 语法为:
返回值(^变量名)(参数列表); 语法稍微有点怪,代码块给变量赋值和普通变量赋值不一样:
代码块变量 = ^[返回值类型][(参数列表)]{
};
代码块声明和赋值语法说明:
① 对于代码块的声明
如果代码块没有返回值则用void关键字代替,对于参数列表如果没有参数,则也用关键字void代替,对于有参数列表,可以对参数列表只指明各个参数的数据类型,可以不指定参数名,当然带上参数名可提高代码的可读性。
void (^myBlock1)(void);// 无返回值,无参数void (^myBlock2)(NSString, int);// 有返回值,有参数NSString (^myBlock3)(void);// 有返回值,无参数//有返回值和参数,并且在参数类型后面加入了参数名(提高代码的可读性)NSString* (^myBlock4)(NSString* name, int age);
② 对于代码块的变量的声明的数据类型
声明一个变量: int (^myBlock)(int); 这样就声明了一个代码块变量, 变量名是:myBlock, 变量名对应的数据类型是: int(^)(int) 整个一块都是代码块所对应的数据类型;除了变量名之外的部分都称为数据类型,代码块变量的声明和普通变量的声明不一样,按照普通变量的那种语法应该是: int(^)(int) myBlock; 但这样Xcode语法报错,要想和传统的变量声明的语法一样,可以这样做: 先将Block的数据类型int(^)(int, int)起一个别名,例如Block , 然后再使用别名 Block block; 这样就和 int a; 这样的语法一致了,这也是最佳实践
typedef int(^Block)(int, int);
Block block;
代码块变量赋值可以在声明的时候赋值,也可以先声明,然后再赋值,分开写;
③:对于代码块的赋值
中括号[] 的意思是说 中括号中的语法可以没有,代码块可以没有返回值,可以没有参数,也可以返回值和参数都没有,
对于没有参数列表的,直接省略参数列表的声明,对于代码块的返回值可以一直省略:原因是系统本身有一个叫“类型推断”的功能,可根据代码块的数据类型推断出返回值的数据类型,对于系统能推断出返回值类型,为了减少代码的书写和带们的简洁一般都会省掉返回值部分,注意要在花括号结尾处 跟上 分号 {};
// 无返回值,无参数myBlock1 = ^ {NSLog(@"%@", @"myBlock1");};// 有返回值(可省略),有参数myBlock2 = ^ (NSString name, int age){NSLog(@"%@ :", name);};// 有返回值(省略返回值语法),无参数(省略参数列表语法)myBlock3 = ^ {return 3.14;};//有返回值(省略返回值语法)和参数myBlock4 = ^ (NSString name, int age){NSLog(@"%@ :", name);return name;};
2. 代码块常用场景
代码块和其他语言中的匿名函数, 闭包差不多, 一个block就是一个匿名的内联代码集合体: 代码块一般作为回调函数使用
可以让你在调用的地方编写代码实现后面将要执行的操作。
把代码块的变量名可以看做方法名来调用block
3. 示例代码
// 变量声明和赋值分开-------------------------------- void(^afterSetValue)(void); afterSetValue = ^{ NSLog(@"变量声明和赋值分开"); }; afterSetValue(); // 有参数,有返回值--------------------------------- int a = 10; int (^myBlock)(int) = ^(int num){ return num * a; }; int result = myBlock(2); NSLog(@"result: %d", result); // 20 // 有参数,有返回值-------------------------------- void (^noReturnBlock2)(int) = ^(int a){ NSLog(@"a:%d", a); }; noReturnBlock2(2); // 无参数,有返回值-------------------------------- int (^noReturnBlock)(void) = ^int{ return 10; }; NSLog(@"noReturnBlock: %d", noReturnBlock()); // 10 // 无参数无返回值--------------------------------- void (^noReturnAndNoPrameterBlock)(void) = ^ { NSLog(@"noReturnAndNoPrameterBlock------"); }; noReturnAndNoPrameterBlock(); // 修改代码块之外的全局变量-------------------------------- __block int b = 1; void (^modifyValue)(void) = ^{ b = 2; }; modifyValue(); NSLog(@"b: %d", b);2016-03-09 11:30:36.886 MianTest[10966:1571284] 变量声明和赋值分开2016-03-09 11:30:36.887 MianTest[10966:1571284] result: 202016-03-09 11:30:36.888 MianTest[10966:1571284] a:22016-03-09 11:30:36.888 MianTest[10966:1571284] noReturnBlock: 102016-03-09 11:30:36.888 MianTest[10966:1571284] noReturnAndNoPrameterBlock------2016-03-09 11:30:36.888 MianTest[10966:1571284] b: 2Program ended with exit code: 0
#import <Foundation/Foundation.h>@interface Calculator : NSObject@property (nonatomic, assign) int result;- (void)calculator:(void(^)(int num))calculator;- (void(^)(void))test;@end
#import "Calculator.h"@implementation Calculator- (void)calculator:(void(^)(int) )calculator { calculator(10); }- (void (^)(void))test { return ^{ NSLog(@"return block"); };}@endmain.m
Calculator * calc = [[Calculator alloc] init]; // 方法参数是代码块 [calc calculator:^(int num) { num += 2; NSLog(@"num is : %d", num); }]; // 方法返回值是代码块--------------------------------[calc test]();2016-03-09 13:29:47.636 MianTest[11022:1587620] num is : 122016-03-09 13:29:47.637 MianTest[11022:1587620] return block
- Objective-C Block基本用法
- Objective-C 空Block用法
- Objective-C中block用法
- 你知道Objective-C中一个很重要的数据类型Block的基本用法吗???
- Objective-C--block的概念和基本使用
- Objective-C 【NSFileManager 介绍-基本用法】
- Objective-C------NSString、NSMutableString 基本用法总结
- objective-c block 讲解
- objective-c block 讲解
- objective-c block 详解
- objective-c block 讲解
- objective-c block 讲解
- Objective-C block
- objective-c block 详解
- objective-c block 详解
- Objective-C中的Block
- Objective-C中的Block
- objective-c block 详解
- Android Touch事件传递
- 3.1 Javascript:探索客户端-设置网页元素根据窗口比例调整位置与大小
- Activity的生命周期介绍(转载)
- struts2 表单提交方式
- RelativeLayout的各种子布局的属性
- Objective-C Block基本用法
- 手机刷机
- bootstrap聪明在哪里(CSS)
- 使用mysqldump导入导出MySQL数据库
- Android四大组件及Intent
- 网络信息安全技术的学习感悟
- 解决ubuntu反复登录的问题
- android开发中,截取百度地图的方法
- Matlab自定义函数的几种方法