黑马软件工程师-OC学习笔记之block
黑马程序员-OC学习笔记之block
所以,如果需要多个block,返回的都是int,参数都是两个int,那么就可以用typedef定义的myBlock类型继续定义多个block变量,功能可以不一样,可以是两个int的加,减,除等等。这样做可以减少代码量,小桥觉得主要还是在代码上增加可读性,我们对
int a;
这种形式很熟悉,但是对
int (^sumBlock)(int, int)
这种形式就不那么熟悉了,所以用typedef定义后的
myBlock sumBlock2;
就变成我们熟悉的语法了。
---------------------- IOS开发、Android培训、期待与您交流!
----------------------
一、什么是block
block是OC中的一个数据类型,但是它很特别,因为它是用来保存一段代码的(可以理解为把一段代码赋值给block类型的变量)。它和函数有点相似,它可以带参数,可以有返回值,调用方式也一样。
一、什么是block
block是OC中的一个数据类型,但是它很特别,因为它是用来保存一段代码的(可以理解为把一段代码赋值给block类型的变量)。它和函数有点相似,它可以带参数,可以有返回值,调用方式也一样。
二、定义一个不带形参没有返回值的block
// // main.m // block // // Created by 葬花 桥 on 14-5-13. // Copyright (c) 2014年 itcast. All rights reserved. // #import <Foundation/Foundation.h> int main() { void (^myBlock)() = ^{ // 定义并赋值block NSLog(@"block你好"); }; myBlock(); // 调用block return 0; }
三、带参数有返回值的block
// // main.m // block // // Created by 葬花 桥 on 14-5-13. // Copyright (c) 2014年 itcast. All rights reserved. // #import <Foundation/Foundation.h> int main() { // void (^myBlock)() = ^{ // 定义并赋值block // NSLog(@"block你好"); // }; // // myBlock(); // 调用block int (^sumBlock)(int, int) = ^(int a, int b){ // 定义block并赋值 return a + b; }; int c = sumBlock(1, 2); // 调用block NSLog(@"sumBlock返回值为%d",c); return 0; }
三、block与函数指针
block与函数指针是非常相似的,小桥在这里演示一下:
上面的指针p就是一个指向函数的指针,函数指针在c语言中用的比较多,特别是linux系统内核中,c语言用结构体并且在结构体中用函数指针来模拟类的方法,用以达到面向对象的效果,所以说面向对象编程是一种思想而不是一种特定的编程语言,这是题外话。
如果用block来写同样的求和功能,是这样的:
四、block与typedef
复杂类型可以用typedef来定义简洁的形式,这在C++的可视化编程的MFC框架中经常见到,一些奇怪的数据类型其实是已知类型的另一种形式。
typedef把block的定义重新定义成一个简洁的形式,如:
block与函数指针是非常相似的,小桥在这里演示一下:
// // main.m // block // // Created by 葬花 桥 on 14-5-13. // Copyright (c) 2014年 itcast. All rights reserved. // #import <Foundation/Foundation.h> int sum(int a, int b) { return a + b; } int main() { int (*p)(int, int) = sum; // 定义函数指针 NSLog(@"sum返回值为%d", p(3, 4)); return 0; }
上面的指针p就是一个指向函数的指针,函数指针在c语言中用的比较多,特别是linux系统内核中,c语言用结构体并且在结构体中用函数指针来模拟类的方法,用以达到面向对象的效果,所以说面向对象编程是一种思想而不是一种特定的编程语言,这是题外话。
如果用block来写同样的求和功能,是这样的:
int sum(int a, int b) { return a + b; } int main() { int (*p)(int, int) = sum; // 定义函数指针 NSLog(@"sum返回值为%d", p(3, 4)); int (^sumBlock)(int, int) = ^(int a, int b){ return a + b; }; NSLog(@"sumBlock返回值为%d", sumBlock(4, 5)); return 0; }
四、block与typedef
复杂类型可以用typedef来定义简洁的形式,这在C++的可视化编程的MFC框架中经常见到,一些奇怪的数据类型其实是已知类型的另一种形式。
typedef把block的定义重新定义成一个简洁的形式,如:
int sum(int a, int b) { return a + b; } typedef int (*sumP)(int, int); // 定义一个sumP类型,它可以定义出一个返回值为int,两个int形参的函数指针 typedef int (^myBlock)(int, int); // 定义一个myBlock类型,它可以定义出一个返回值为int,两个int形参数的block变量 int main() { int (*p)(int, int) = sum; // 定义函数指针 NSLog(@"sum返回值为%d", p(3, 4)); int (^sumBlock)(int, int) = ^(int a, int b){ return a + b; }; NSLog(@"sumBlock返回值为%d", sumBlock(4, 5)); sumP p2 = sum; // 定义一个函数指针p2 NSLog(@"%d", p2(10, 11)); myBlock sumBlock2 = ^(int a, int b){ return a + b; }; NSLog(@"%d", sumBlock2(12, 13)); return 0; }
所以,如果需要多个block,返回的都是int,参数都是两个int,那么就可以用typedef定义的myBlock类型继续定义多个block变量,功能可以不一样,可以是两个int的加,减,除等等。这样做可以减少代码量,小桥觉得主要还是在代码上增加可读性,我们对
int a;
这种形式很熟悉,但是对
int (^sumBlock)(int, int)
这种形式就不那么熟悉了,所以用typedef定义后的
myBlock sumBlock2;
就变成我们熟悉的语法了。
---------------------- IOS开发、Android培训、期待与您交流! ---------------------- 详细请查看:www.itheima.com