一 定义
1
1⃣Block ,块语法 可以用block 去保存一段代码,或者说是封装一段代码,
2⃣ .block 实际上是由 C 语言实现的,执行效率很高
3⃣.block 实际上借鉴了函数指针的语法
2. 数据类型
1. 返回值类型(^)(参数类型1 参数名1, 参数类型2 参数名2,….);
2. 返回值类型(^)();没参数 也得加 void (^)():无返回值 无参数
3.参数名可以省略
1⃣ 无返回值 无参数
void (^)():
①声明: void(^myBlock1)();
②实现:
myBlock1 =^(){
NSLog(@"do you eat?");
};
// block 的调用 格式: block 变量名(实参1,实参2…);
myBlock1();
2⃣ 无返回值 有参数
void (^)(int,int);
①声明:
void(^myBlock2)(int a,int b);
void (^myBlock2); 这种的是省略了 后面的参数 不建议用
② 实现 // 有参无返回值的 block
myBlock2 = ^(int a ,int b){
NSLog(@"a+b = %d",a+b);
};
myBlock2 (2,4);
3⃣ 有返回值 无参数
int (^)();
①声明:int (^myBlock3)();
②实现: myBlock3 = ^(){
return 10;
};
int result = myBlock3();
NSLog(@"%d",result);
注意:因为有返回值,所有需要设定一个新的变量名来接收 并打印
4⃣ 有返回值 有参数
int(^)(int,int):
① 声明: int (^myBlock4)(int a,int b);
②实现: myBlock4 = ^(int a,int b){
return a + b ;
};
int result1 = myBlock4(4,6);
NSLog(@"%d",result1);
二 应用
注意: block 定义式, block 块中的代码不执行,block 调用的适合 block 块中的代码才执行,
1. 赋值
block 的实现就是一种赋值
block 的赋值( block 的实现)
// 格式
1. ^(参数类型1 参数名1,参数类型2 参数名2….){
执行代码;
}
2.注意: block 有返回值 需要使用 return 返回数据;
参数名必须写:
ps:
① 定义一个 block 块 ,有一个参数 (nsstring* str)实现将字符串@"123",转换为 int 类型的数据,并返回
int (^stringToInt) (NSString *) =^(NSString *str){
// 将字符串对象转化为基本数据类型
return [str intValue];
};
NSLog(@"%d",stringToInt(@"123"));
*/
- 内部访问
1 注意事项:
1⃣️全局变量 block 可以直接使用,不需要加__block修改;
2⃣️局部变量需要加__block 修饰,才能在 block 内部修改;
3⃣️局部变量不加__ block ,只能使用不能修改,会报错
ps:① int c = 100;
void (^print)();
print = ^(){
//在这里写就是修改
b = 200;
NSLog(@"%d %d",b,c);//这里是使用
};
print ();
注意:这里的 C 在没有__ block 的时能使用 就是只能在 nsl 里面打印 但是不应在执行体{}里面做更改
三 排序
1.
NSMutableArray *coloarr = [[NSMutableArray alloc]initWithObjects:@"blue",@"black",@"pink",@"red", nil];
//方法名 sort 不要写错 就会打不出来
[coloarr sortUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
// 相邻两个元素(obj1 obj2)的比较规则
// 系统满足返回值 NSOrderedDescending;
// 系统的快速排序满足以 NSOrderedDescending;条件为准
if ([obj1 compare:obj2] == -1) {
return NSOrderedDescending;
}else if([obj1 compare:obj2] == 0){ return NSOrderedSame;
}else{
return NSOrderedAscending;
}
}];
NSLog(@"%@",coloarr);
四 字面量 (语法糖)
1.数组
1⃣普通的: NSNumber *number = [NSNumber numberWithInt:100];
字面量:NSNumber *number1 = @100;
2⃣PT;NSArray *arr =[NSArray arrayWithObjects:@”1”,@”2”,@”3”,@”4”,nil];
字面量:NSArray *arr1 =@[@”1”,@”2”,@”3”];
3⃣ 可变的用字面量 需要加.mutableCopy
NSMutableArray *arr3 =@[@"1",@"2",@"3"].mutableCopy;
NSLog(@"%@",arr3[0]);// 可以通过下标来取值 可变不可变 都可以用
注意:赋值的话只能在可变中 不可变里的不行
2 字典
1⃣ 不可变
NSDictionary *dic = @{@"a":@"A",@"B":@"b"};
NSLog(@"%@",dic);
//访问 value
NSLog(@"%@",dic[@"a"]);// 放一个完整的 Key 值就可以.
2⃣ 可变
NSMutableDictionary *dict = @{@"a":@"2",@"B":@"3"}.mutableCopy;
// .mutableCopy 千万不能忘 否则会出错
NSLog(@"%@",dict);
NSLog(@"%@",dict[@"B"]);
//赋值
dict[@"B"] = @"qwe"; // 对 key 进行赋值 就可以改变 Value;
NSLog(@"%@",dict);