block主要准备分为3个文章记录。 第一章:基础概念和使用 第二章:捕获变量 第三章:持有变量
block的定义是:带有自动变量的匿名函数。 或者也可说是一个闭包函数。
block的结构体:
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
/* Imported variables. */
};
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};
下面是如何把块变量赋值给一个变量的语法讲解:
int value = 7;
int (^addBlock)(int num) = ^ (int num) { return num + value; };
//变量 int 是返回类型 (^addBlock) "^"符号将addBlock声明为一个块对象 (int num) 声明参数
//块变量 ^ (int num) { return num + value; }; 整体定义为块对象的语法结构 { return num + value; } 这个部分是块对象主体部分
(1) 使用typedef给block定义别名,简化使用
typedef addBolck (^addBolck)(int num);
(2) 作为局部变量
int (^addBlock)(int num) = ^ (int num) { return num + value; };
(3) 作为属性
@property (nonatomic, copy) int (^addBlock)(int num);
(4) 作为方法变量
- (void)someMethodBlock:(int (^)(int num))block;
(5) 作为局部变量
[self someMethodBlock:^returnType (parameters) {...}];