关于iOS的block块代码的理解

来源:互联网 发布:网络流行语2016口头禅 编辑:程序博客网 时间:2024/06/05 18:37

    在学习和使用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


0 0