在学习和使用block的这段时间, 从难以理解到现在勉强会用, 有了自己的一套理解, 希望能够帮助大家学习block, 因为block块常用于OC的方法中, 所以举了个例子来说明:
方法声明:
@interface TYPerson : NSObject
- (void)watchTYWithFriend:(void (^)(int number))person;
这是在TYPerson定义一个block块 可以理解为C语言的函数的声明 相当于c里的 void text(int number);
方法实现:
- (void)watchTYWithFriend:(void (^)(int))person
{
if (person) {
person(3);
}
}
在这里虽然是OC方法的实现 ,但是里面的Block块却可以这么理解
这里的 person(3)可以理解为c语言的函数的调用, 就相当于C里的
text (3);
方法的调用:
TYPerson *person = [[TYPerson alloc] init];
[person watchTYWithFriend:^(int number) {
printf("%d", number);
}];
这里是是调用这个OC方法, 但是里面的block代码, 就是{之间的代码} 可以理解为C语言的函数的实现 等同于
void text() {printf("%d", number);}
即:在方法的声明中,里面的block块也可以理解为声明, 但是在方法的实现里, 里面的block却恰恰相反, 理解为block的调用, 同样, 在方法的调用里, 里面的块代码, 才是block块的实现。 下面是关于block的简介
概述
- 代码块对象简称为“代码块”, 是对C语言中函数的扩展, 运行在iOS4.0和OS X 10.6版本以上
- 代码块是由C语言实现的, 所以在各种以C作为基础的语言都有效 Objcetive -C, C++ Objcetive-C++
- 代码块存储的数据是一个函数体, 使用代码块时, 可以传入参数, 并且可以获得返回值。
代码块 VS 函数指针
block格式
返回值类型 (^代码块名)(参数列表) = ^返回值类型 (参数列表){表达式;};
eg: void (^myBlock)() = ^{printf("Hello, Block\n")};
返回类型和参数列表可以有条件省略
如果不适用参数, 参数也可以省略
函数指针格式
返回值类型 (* 函数名)(参数列表);
eg:void (*myFunction) (void);
代码块用法:
void (^myBlock)() = ^{NSLog(@"hi, baby");};
myBlock();
使用typedef定义相同类型的代码块:
typedef void (^person)(id obj1, id obj2);
person myPerson; 定义一个和person一样类型的代码块myPerson