OC中的block与C中的函数指针有些相似
我们先回顾一下函数指针
回顾函数指针:指向函数的指针
保存的函数的地址
int (*p)(int a, int b) = NULL;
p = sumValue;
// 函数指针调用
NSLog(@”%d”,p(3,5));
Block标志 ^托字符(凸起符)
block保存的是 有特定功能的函数体
数据类型 + 变量名 = 初值
int (^变量名)(int a,int b) = ^初值(跟前面类型要一致)
初值的部分 是一个没有名字的 函数体
int (^Block)(int a, int b)= ^int (int a, int b){
return a +b;
};
打印参数的block OC的
无返回值用void
void (^PrintfBlock)(NSString *str) = ^void (NSString *str){
NSLog(@"%@",str);
};
// block的调用直接使用block的名字去调用
PrintfBlock(@"哈哈哈哈");
PrintfBlock = ^void (NSString *str){
NSLog(@"%@",str);
NSLog(@"%@",str);
};
PrintfBlock(@"asd");
block的好处
把block当做一个参数 传入方法中
非常灵活 可以灵活掌控block的实现
也就是 你传入的block实现的是什么功能
你这个方法 就实现什么功能
block排序
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1",@"4",@"2",@"3", nil];
NSNumber *n1 = [NSNumber numberWithInt:11];
// 语法糖 初始化NSNumber类型方法
NSNumber *n2 = @11;
NSMutableArray *array = [NSMutableArray arrayWithObjects:@8,@12,@9,@11, nil];
[array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
实现部分 填写obj1 和obj2
实现0原理:数组中两个元素进行比较
比较后 返回值 如果前面比后面大 则交换
经此比较到最后一个元素 完成排序
compare:可以比较的类型
1.字符串类型(NSString *)
2.NSNumber *类型
NSString *str1 = (NSString *)obj1; //这边是比较字符串的
NSString *str2 = (NSString *)obj2; // 如果想要比较NSNumber 只需要转化成NSNumber就可以了
if ([str1 compare:str2] > 0) {
return NSOrderedDescending;
} else if ([str1 compare:str2] == 0) {
return NSOrderedSame;
} else {
return NSOrderedAscending;
}
// 交换位置来排序的
}];
NSLog(@"%@",array);
*以上输出注意的是:如果可变字典中初始化的4个对象 是: @”12”,@”8”,@”11”,@”9”*
如果按升序排序的话 一般情况下我们肯定会认为结果是 8,9,11,12 但是这边用字符串比较的时候结果是 11,12,8,9 这是为什么呢?
这里由于调用了compare方法进行比较,compare的原理是比第一个数,第一个数相同就比第二个,以此类推.
比较完一位 结果是: (12,11) 8 , 9
在比较是结果就是11,12,8,9
**
字典数组等语法糖(快捷)]