Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 块声明的结构_Objective C_Objective C Blocks - Fatal编程技术网

Objective c 块声明的结构

Objective c 块声明的结构,objective-c,objective-c-blocks,Objective C,Objective C Blocks,当声明块时使用此语法背后的基本原理是什么(即左方括号和插入符号) 例如: int (^myBlock)(int) = ^(int num) { return num * multiplier; }; C块:语法和用法 指向块的变量采用与指向函数的变量完全相同的语法,除了*替换为^。例如,这是一个函数指针,指向接受int并返回float的函数: float (*myfuncptr)(int); float (^myblockptr)(int); 这是一个块指针,指向一个接受int并返

当声明
块时
使用此语法背后的基本原理是什么(即左方括号和插入符号)

例如:

int (^myBlock)(int) = ^(int num) {
    return num * multiplier;
};

C块:语法和用法

指向块的变量采用与指向函数的变量完全相同的语法,除了*替换为^。例如,这是一个函数指针,指向接受int并返回float的函数:

float (*myfuncptr)(int);
float (^myblockptr)(int);
这是一个块指针,指向一个接受int并返回float的块:

float (*myfuncptr)(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;
};
这定义了一个块文字(from after=to,include}),显式地提到它的返回类型、参数列表、块体、返回语句,并将该文字赋给变量myvar1

文本是可以在编译时生成的值。整数文本(int a=3;中的3)和字符串文本(const char*b=“foobar”;)中的“foobar”)是文本的其他示例。块声明是文本这一事实在以后进入内存管理时很重要

在这样的块中查找return语句对某些人来说很麻烦。您可能会问,它是否从封闭函数返回?否,它返回一个可由块的调用者使用的值。请参阅“调用块”。注意:如果块有多个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。如果块具有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程序员都熟悉的。

是的,但没有什么可疑之处,我也发布了源代码。但我必须重新格式化整个答案