block学习

NSString * (^calculate)( NSString *, NSString *);
int (^Multiply)( int , int );
以上是两个 Block 的申明定义
可以放在头文件之上 , 即不要放在 interface definition
也可以放在 implement , 注意 , 不要放在函数里 , 否则不具备函数块内可见
上面是两个申明的 block 类型的变量 ; 可以理解为一个函数指针 , 比如 calculate,Multiply 两个函数指针 ;

calculate =^( NSString *part1, NSString *part2)
{
return [part1 stringByAppendingFormat :part2];
};
NSString *test= calculate ( @"fuck" , @"U" );
//test is "fuckU"
Multiply = ^( int num1, int num2) {
return num1 * num2;
};
int result = Multiply ( 7 , 4 ); // result is 28

上面是两个函数指针,最终给予赋值;
calculate等于的东西,必须要跟类型匹配上;
下面的test即可执行了这个函数;结果也验证了;

好吧,这么理解:
如果^在括号里面,那么与^同在括号内的英文字符,代表这是一个”函数指针”的概念,类似快速引用; 例如: char (^square) (int); 前面是返回值类型char,后面是参数int类型;
如果^在括号外,那么就是一个具体的block的实现函数的抬头符.之后的内容,无非是参数,大括号,实现内容;可参考square = ^(int a ) {return a*a ;};
square(5)即是25;

总之,block基本就是这样;省去了你定义一个不必要的函数,然后再调用,烦死了;还要考虑备份现场;因为block是实时运算,运算的数据全部重新拷贝一份;你可以理解为new了一个程序在沙盒里计算,怎么着都不会影响;当然了,更复杂的有__block;唉.复杂的结果,就是代码可读性差;
注意,block是一个称呼;不是关键字; ^才是关键符号;
我个人觉得,在代码里用block单词作为block的”函数指针”的,都TMD脑子有病;这不故意混淆视听么?比如,你一个用来解析json的block,你丫干脆用JsonBlock,何必故意弄个这么绕口的?
那么block适合干啥?
我现在思维禁锢,因为之前没有^,我们也活得好好的,现在唯一想出来的好处,就是偷懒,随取随用,这要这个函数没有复用的必要,那就放心大胆的用吧.省了头文件定义,冗余的格式.

你可能感兴趣的:(学习,语言,block)