您的位置:首页 > 移动开发 > IOS开发

关于iOS的block块代码的理解

2014-10-19 14:52 176 查看
在学习和使用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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: