block 的四种形式
// 1. 无参数, 无返回值
void(^block)() = ^(){
// 函数大括号里的代码段
NSLog(@"我真帅");
};
// block 的使用
block();
// block 自己不会执行,必须调用才会执行block大括号里的代码段
// 2. 有参数, 无返回值
void(^block)(int, int) = ^(int a, int b){
int max = a > b ? a : b;
NSLog(@"%d", max);
};
// 调用
block(10, 20);
// void(^)(int, int) 是 block 的类型, 它的名是 block 我们也可以通过名进行调用
// 参数是一个数组, 对数组进行遍历
void(^block)(NSArray *) = ^(NSArray *arr)
{
for (NSString *str in arr) {
NSLog(@"%@", str);
}
};
NSArray *arr = @[@"6", @"3", @"1", @"2", @"9", @"5"];
block(arr);
// 3. 有返回值, 无参数
// 有返回值在函数段的最后加上return;
NSInteger(^block)() = ^()
{
return (NSInteger)100;
};
// block 调用时没有参数也要加上括号
NSLog(@"%ld", block());
// 4. 有参数, 有返回值
NSString *(^block)(NSArray *, NSInteger) = ^(NSArray *arr, NSInteger index)
{
return arr[index];
};
NSLog(@"%@", block(@[@"1", @"2"], 1));
NSInteger (^block)(NSString *) = ^(NSString *str)
{
return str.integerValue;
};
NSLog(@"%ld", block(@"232h323"));
NSDate *(^block)(NSString *) = ^(NSString *str)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [formatter dateFromString:str];
};
NSLog(@"%@", block(@"2015-10-13 12:43:24"));
// block 的函数段中更多使用参数,而返回值更多的是调用一方使用
通过新的block 写一个block
typedef NSString *(^Block)(NSArray *);
Block block = ^(NSArray *arr){
return arr[0];
};
block 和 局部变量
// __block 相当于给a一个在block中修改的权限, 否则它只能取值, 不能赋值
__block int a = 10;
void(^block)() = ^
{
a = 10 * a;
NSLog(@"%d", a);
};
block();
// 通过block对数组进行遍历
NSArray *arr = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil];
// 系统的block
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"%@", obj);
}];
// 系统block的用法就是回车
多态
// 准备创建两个类 BaseModel 和 Person,Person 是 BaseModel 的子类
BaseModel.m 文件
+(id)baseWithName:(NSString *)name
sex:(NSString *)sex
{
// 多态的方式完成对象的创建
id obj = [[[self class] alloc] initWithName:name sex:sex];
return obj;
}
main.m文件
Person *per = [Person baseWithName:@"张阳阳" sex:@"男"];
NSLog(@"%@", per.name);
数组排序
// 数组对字符串的排序
// 不可变数组
NSArray *arr = @[@"zhangyangyang", @"wuhe", @"liushanshan", @"yangli", @"wangjunmin"];
// SEL是方法选择器,它是方法选择器的类型
NSArray * newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", newArr);
// 可变数组
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"zhangyangyang", @"wuhe", @"liushanshan", @"yangli", @"wangjunmin", nil];
[arr sortUsingSelector:@selector(compare:)];
NSLog(@"%@", arr);
// 对对象进行排序
// 新建4个人的对象
Person *per1 = [Person baseWithName:@"limuran" sex:@"nv"];
Person *per2 = [Person baseWithName:@"wuhe" sex:@"nan"];
Person *per3 = [Person baseWithName:@"liuxinqi" sex:@"nan"];
Person *per4 = [Person baseWithName:@"shangshuai" sex:@"nan"];
NSArray *arr = @[per1, per2, per3, per4];
// 以学生的姓名作为排序的依据
// 不可变数组
NSArray *newArr = [arr sortedArrayUsingComparator:^NSComparisonResult(Person* obj1, Person* obj2) {
return [obj1.name compare:obj2.name];
}];
for (Person *temp in newArr) {
NSLog(@"%@", temp.name);
}
// 可变数组
NSMutableArray *mArr = [NSMutableArray arrayWithObjects:per1, per2, per3, per4, nil];
[mArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
Person *per11 = (Person *)obj1;
Person *per22 = (Person *)obj2;
return [per11.name compare:per22.name];
}];
for (Person *per in mArr) {
NSLog(@"%@", per.name);
}