本文从简单的C语言的各种声明,复杂的声明组合,到***Objective-CSyntaxforblockbokck中的代码。花点时间了解代码块(block)的推导和组织形式。一旦你了解了这些,你就可以轻松地声明和使用它,而不必每次需要时都去谷歌。如果你想用块声明来表达你能想到的东西,请继续阅读!Declarators(specifiers)C语言通过说明符来声明变量。说明符做两件事:定义这个变量的类型;为变量定义一个名称,以便它可以在其范围内使用;让我们从一个基本的说明符开始:?***C语言代码行。int是基本变量类型,a是变量的名称(或标识符)。开始看说明符的时候,应该从变量名(说明符)开始,先看变量名右边的部分,再看变量名左边的部分(下篇解释为什么这样已经完成了)。诠释;变量名a右边什么都没有,直接说明:a是int类型的变量。一个变量声明只有一个基类型,即说明符最左边的部分。说明符可以通过修饰符改变基本数据类型,从而派生出新的类型。修饰符有以下四个符号:*、[]、()、^。指针修饰符(*)类型依然是int,变量名是a。但是指针修饰符(*)表示a是指向int值的指针,但它本身不是int值。指针修饰符(*)始终位于变量的左侧。数组修饰符([])上面的数组修饰符([])表示a是一组int,而不是简单的int值。声明的时候加上数组的长度,比如inta[10];数组修饰符([])始终位于变量的右侧。函数修饰符(())函数修饰符的意思是:f是一个返回int值的函数。函数修饰符可以携带参数,如intf(long);意思是:f是一个函数,它接受一个long参数并返回一个int值。函数修饰符()总是在变量的右边。修饰符的组合指针修饰符(*)和数组修饰符([])组合修饰符可以组合起来产生复杂的变量类型。就像算术运算符一样,算术运算符可以组合在一起,然后根据优先级判断第一个运算符(*和/的优先级高于+/-),修饰符也是如此。修饰符[]和()比show*和^具有更高的优先级。因为[]和()优先级高,放在变量的右边,所以遇到复杂的说明符,应该从变量名(标识符)开始,先看右边的部分,而然后看左边的部分。例如,或者为了提高可读性,使用括号来扩展变量名和右边的部分。它们的意思都是:a是一个指针数组,数组中的每个元素都指向一个int类型的值。有人可能会问,如何声明一个指向一组int值的指针?可以实现如下语句:指针修饰符的优先级低于数组修饰符的优先级,所以必须放在括号中提高其优先级。表达如下:a是指向一组int值的指针。数组修饰符([])结合函数修饰符()不能声明每个元素都是函数的数组,也不能声明返回数组或函数的函数。但是函数参数可以是数组。例如?上面的意思是:f是一个有一个参数的函数,它是一个长度为10的数组(数组中的每个元素都是一个int类型的值),函数返回一个int类型的值。指针修饰符(*)和函数修饰符()的组合以上两个声明都表明:f是一个函数,它返回一个指针,该指针指向一个int类型的值。如果你想要一个指向函数的指针,你应该怎么做?上面语句的意思是:f是一个函数指针,它指向一个返回int类型值的函数。代码块(又名闭包)修饰符(^)Apple在其提议的ANSI-C标准扩展中引入了此修饰符。称为代码块指针修饰符(closuremodifier)。该修饰符与指针修饰符非常相似。声明代码块与声明指向函数的指针相同。这个修饰符只能用在函数上,所以int^a;是错的。这解释了为什么int^b()是非法的并且会导致编译器错误。如果按照上面说的读说明符的方法看说明符,说明b是一个函数,返回值是一个代码块指针,指向一个int类型的值。这就是为什么你问为什么^b应该放在括号中。b表示:代码块,指向返回int类型值的函数或者简称为返回int类型值的代码块。也可以在定义代码块函数时携带参数,例如:代码块有一个long类型的参数,一个int类型的返回值。这就是代码块声明的用武之地。为了在Objective-C中使用代码块,您需要记住一些额外的语法。1.定义一个代码块的语法;2.如何将代码块传递给Objective-C方法。抽象说明符抽象说明符由两部分组成:抽象说明符和变量名。抽象说明符在标准C语言中有三种使用场景:int*a;长*b=(长*)a;(long*)是一个抽象说明符:它表示指向long类型的指针。作为sizeof()的参数:malloc(sizeof(long*));作为函数的参数类型:intf(long*);Objective-C使用抽象说明符作为方法参数或方法的返回值;-?(long?**)methodWithArgument:(int?*)a;其中(long**)和(int*)都是抽象说明符。所以为了能够在Objective-C方法中使用代码块作为参数或者返回值,我们需要为这些代码块找到抽象说明符。去掉说明符中的变量名即可获得;例如:int(^b)()删除变量名b以获得抽象说明符int(^)()和int(^b)(long)删除变量名b以获得抽象说明符int(^)(long).示例:-?(void)methodWithArgument:(int(^)())block;-?(void)anotherMethodWithArgument:(void(^)(long?arg1))块;抽象说明符中的参数名称可以省略。因为Xocde会自动帮你完成这些。Blockliteral写inta=2;时,inta是说明符,2是a的值,也叫实现。插入符号(^)也用作一元运算符,将函数实现转换为代码块。您不需要指定代码块的返回值,它会自动从返回语句中推断出来。因为是代码块的实现部分,所以需要定义参数的名称。例如:int(^block)(long,long);实现如下block?=?^(long?a,?long?b)?{??int?c?=?a?+?b;??return?c;}总结看起来很复杂,Objective-C中的块语法是建立在标准C语法之上的。Objective-C中的块就像一个指针,指向一个函数。一旦你了解了这些并添加了一点连接,你会发现这个块很容易掌握。
