1. block
1. Block本质上是匿名函数,定义在main函数内部,和C语言的函数还是有区别的
/*
写⼀个 返回值为整型 参数为OC字符串(仅一个参
数)的block,实现将字符串转换为整型的功能。
*/
int (^stringToInt)(NSString *) = ^(NSString *str){
return [str intValue];
};
int a = stringToInt(@"123456987654");
NSLog(@"%d",a);
2. 使用typedef定义block:
typedef int(^twoNumbers)(int ,int);
twoNumbers subValue = ^(int a, int b){
return a - b;
};
NSLog(@"%d", subValue(12, 3));
3. 在block内部可以访问外部变量:
// 访问外部变量:
void (^MyBlock)() = ^{
NSLog(@"%@", str);
};
MyBlock();
4. 变量地址是否相同:
// 访问外部变量时,地址是同一个吗:
int b = 6;
NSLog(@"外部地址:%p", &b);
void (^MyBlock)() = ^{
NSLog(@"内部地址:%p", &b);
};
MyBlock(); // 结果是:外部地址:0x7fff5fbff7ac 内部地址:0x7fff5fbff798 两个地址不一样
5.修改局部变量: __block
// 修改外部变量:
__block int c = 0;
twoNumbers subValue = ^(int a, int b){
c = a - b;
return c;
};
subValue(12, 3);
NSLog(@"%d", c); // 结果是:9
总结:
在block内部可以访问外部变量,
在block内部不能修改局部变量的值,
block内部访问变量的地址和外部变量本身的地址不一样,相当于拷贝了一份,
如果想在block内部对外部变量进行修改:有两种方法: ----a:将外部变量定义为全局变量 ------b:在外部变量前加__block
2. block与数组排序:
#pragma mark--- block与数组排序
{
// 1. 第一种排序方法: 自己写的方法 直接调用
NSArray *array = [NSArray arrayWithObjects:@"sd", @"gf", @"bgf", @"sadf", nil];
NSComparator com = ^(id str1, id str2){
return -[str1 compare:str2];
};
NSArray *sortArray = [array sortedArrayUsingComparator:com];
NSLog(@"%@", sortArray);
// 2. 第二种排序:系统的不用自己定义方法
NSArray *sortArray2 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
NSLog(@"sortArray2:%@", sortArray2);
}
3. iOS中的字面量:
字面量是⼀种新型的写法,能在⼀定程度上简化代码。
字面量创建的对象是便利构造的,且是不可变的。
例如:字典,集合,字符串,数组,等的简单创建就是使用了字面量