当声明block
使用这种语法的基本原理是什么时(即左边的括号和插入符号)?
(^myBlock)
例如:
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
当声明block
使用这种语法的基本原理是什么时(即左边的括号和插入符号)?
(^myBlock)
例如:
int (^myBlock)(int) = ^(int num) {
return num * multiplier;
};
C 块:语法和用法
指向块的变量采用与指向函数的变量完全相同的语法,除了 * 替换为 ^。例如,这是一个函数指针,指向一个采用 int 并返回 float 的函数:
float (*myfuncptr)(int);
这是一个块指针,指向一个采用 int 并返回一个浮点数的块:
float (^myblockptr)(int);
与函数指针一样,您可能希望对这些类型进行 typedef,否则它会变得相对复杂。例如,一个指向一个块的指针返回一个块,该块将类似于void (^(^myblockptr)(void (^)()))();
,这几乎是不可能读取的。稍后一个简单的typedef,它更简单:
typedef void (^Block)();
Block (^myblockptr)(Block);
声明块本身是我们进入未知的地方,因为它看起来不像 C,尽管它们类似于函数声明。让我们从基础开始:
myvar1 = ^ returntype (type arg1, type arg2, and so on) {
block contents;
like in a function;
return returnvalue;
};
这定义了一个块文字(从 after = 到并包括 }),明确提及它的返回类型、参数列表、块体、return 语句,并将此文字分配给变量 myvar1。
文字是可以在编译时构建的值。整数文字(int a = 3; 中的 3)和字符串文字(const char *b = "foobar"; 中的 "foobar")是文字的其他示例。当我们进入内存管理时,块声明是文字这一事实很重要。
在这样的块中找到 return 语句对某些人来说是令人烦恼的。您可能会问,它是否从封闭函数返回?不,它返回一个可供块调用者使用的值。请参阅“调用块”。注意:如果块有多个返回语句,它们必须返回相同的类型。
最后,块声明的某些部分是可选的。这些都是:
例子:
myblock1 = ^ int (void) { return 3; }; // may be written as:
myblock2 = ^ int { return 3; }
例子:
myblock3 = ^ void { printf("Hello.\n"); }; // may be written as:
myblock4 = ^ { printf("Hello.\n"); };
// Both succeed ONLY if myblock5 and myblock6 are of type int(^)(void)
myblock5 = ^ int { return 3; }; // can be written as:
myblock6 = ^ { return 3; };
我认为基本原理是它看起来像一个函数指针:
void (*foo)(int);
任何 C 程序员都应该熟悉它。