1.如何定义block?
等号左边是声明 等号右边是实现。
声明部分:先写返回值类型 然后(Block)然后(参数名);一定要括号括起来
实现部分: ^托字符 返回值类型
2.block 如何应用 :数组排序
应该注意的问题:
1 进行比较的时候用的是“对象”
比如:
Student *stu1 = [[Student alloc]initWithName:@"wangbadan" withSex:@"nan" withAge:13 withScore:77 withNumber:3];
NSArray *array = [NSArray arrayWithObjects:stu1,stu2,stu3 ,nil ];
注意这里用的时stu1(对象) 而不是@"stu1"
2 进行不改变的比较时,是有返回值类型的
array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
如果写成这样是错误的:
[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
因为sortedArrayUsingComparator的返回值类型是一个数组,所以必须用一个数组来接收它。从输出的结果来看没有进行任何排序
3 思考(for in)循环输出
4 做项目时候会用到的:
//block是使用C语言里面结构体实现的(放在做项目的时候可以去研究)
NSInteger __block count = 0;(block前面加两个横杠)
// NSInteger count = 0;
NSInteger (^stringBlock)(NSString *)= ^NSInteger(NSString *string){
NSInteger number = [string integerValue];
count++;//block内部拷贝过程,把一个局部变量拷贝过来当做常量来使用(这个写法是改变了block,如果不在上面添加NSInteger __block count = 0;来实现的,如果不添加就是错误的。)
countNumber = countNumber-5;
// 全局变量可以在block内部进行使用,也可以进行修改
number =number +count+countNumber;
return number;
};
NSInteger result= stringBlock(@"3");
NSLog(@"%lu",result);
// 如果想改变block的局部变量,在它的上面写上__block