OC_Block

// BaseModel.m
+ (instancetype)baseWithName:(NSString *)name
                         sex:(NSString *)sex
{
    // 多态的方式完成对象的创建
    id obj = [[[self class] alloc] initWithName:name sex:sex];
    return obj;
}
// main.m文件主函数上边
NSInteger maxValue(NSInteger a, NSInteger b)
{
    return a > b ? a : b;
}
typedef int DT;
// 把一个函数类型重新命名
// 新的类型名写在*的后面
typedef int (*PFUN)(int, int);
// Blcok
// 有返回值,有参数
typedef NSString *(^lock)(NSArray *, NSInteger);
// 有返回值,无参数
typedef NSInteger (^testBlock)();
    // 栈
    int a = 10;
    NSLog(@"%p", &a);
    // 堆
    int *p = malloc(40);
    NSLog(@"%p", p);
    // 全局静态
    static int b = 10;
    NSLog(@"%p", &b);
    // 常量区
    // 常量字符串
    char *str = "iPhone";
    NSLog(@"%p", str);
    // 代码区
    NSLog(@"%p", maxValue);
    // 函数指针的类型
    NSInteger (*p1)(NSInteger, NSInteger) = maxValue;
    NSLog(@"%p", p1);
    // 函数指针的调用
    NSLog(@"%ld", p1(2, 3));
    // Block的四种形式--------------------------------------
    // 1.无参数,无返回值
    void (^block)() = ^(){
        NSLog(@"今天阴天");
    };

    // block的使用
    block();
    // block自己不会执行,必须调用才会执行block大括号里的代码段

    // 2.有参数,无返回值
    void (^block1)(NSInteger, NSInteger) = ^(NSInteger a, NSInteger b){
        NSInteger max = a > b ? a : b;
        NSLog(@"%ld", max);
    };
    block1(10, 20);
    // void (^)(NSInteger, NSInteger) 是block的类型,它的名是block,我们也通过名进行调用

    void (^block2)(NSString *) = ^(NSString *str){
        NSLog(@"%@", str);
    };
    block2(@"你好");

    // 参数是一个数组,对数组进行遍历
    void (^block3)(NSArray *) = ^(NSArray *arr){
        for (NSString *temp in arr) {
            NSLog(@"%@", temp);
        }
    };
    block3(@[@"1", @"2", @"3", @"4"]);

    // 3.有返回值,无参数
    // 有返回值在函数段的最后要加上return
    NSInteger (^block4)() = ^(){
        // NSInteger默认是long型 返回一个100(默认int型)时需要转换
        return (NSInteger)100;
    };
    // block调用时没有参数也要加上括号
    NSLog(@"%ld", block4());

    // 4.有返回值,有参数
    NSString *(^block5)(NSArray *, NSInteger) = ^(NSArray *arr, NSInteger index){
        return arr[index];
    };
    NSArray *arr = @[@"1", @"2", @"3", @"4"];
    NSLog(@"%@", block5(arr, 3));
    // lock是定义的新类型名,在主函数上边
    lock l = block5;
    NSLog(@"%@", l(arr, 2));
    // 练习 写一个返回值为整型 参数为NSString(仅一个参数)的block,实现将字符串转换为整型的功能
    NSInteger (^block0)(NSString *) = ^(NSString *str){
//        return [str integerValue];
        return str.integerValue;
        // 字符串转变为整型是它本身的一个属性
    };
    NSString *str = @"111";
    NSLog(@"%ld", block0(str));
    // 练习 参数日期的字符串,返回NSDate类型的日期对象
    NSDate *(^block6)(NSString *) = ^(NSString *str){
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyy.MM.dd HH:mm:ss"];
        NSDate *date3 = [formatter dateFromString:str];
        NSDate *date0 = [NSDate date];
        NSTimeZone *zone0 = [NSTimeZone systemTimeZone];
        NSLog(@"%@", zone0);
        NSInteger seconds0 = [zone0 secondsFromGMTForDate:date0];
        NSLog(@"%ld", seconds0);
        // NSTimeInterval 就是一个NSInteger型 直接用second0就可以
        NSDate *dateNow = [NSDate dateWithTimeIntervalSinceNow:seconds0];
        NSTimeInterval TimeInterval = [dateNow timeIntervalSinceDate:date0];
        NSLog(@"%g", TimeInterval);

        date3 = [NSDate dateWithTimeInterval:seconds0 sinceDate:date3];
        return date3;
    };
    NSLog(@"%@", block6(@"1993.09.29 18:00:00"));
    PFUN p = addNum;
    NSLog(@"%d", p(10, 20));
    // block和局部变量
    int a = 10;
    // __block相当于给a一个在block中修改的权限,否则它只能取值,不能赋值
    __block int c = 10;
    void (^block7)() = ^(){
        int b = 10 * a;
        c = c * 10;
        NSLog(@"%d", b);
    };
    block7();
    // 通过block对数组进行遍历
    NSArray *arr1 = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil];
    // 系统的block 用法就是回车(看到^, 回车)
    [arr1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"%@", obj);
    }];
    // 数组排序
    // 数组对字符串的排序
    // 不可变数组
    NSArray *arr0 = @[@"zhangyangyang", @"wuhe", @"liushanshan", @"yanglin", @"wangjunmin"];
    // 冒号后边SEL是方法选择器, 它是方法选择器的类型
    NSArray *newArr = [arr0 sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"%@", arr0);
    NSLog(@"%@", newArr);

    // 可变数组
    NSMutableArray *arr00 = [NSMutableArray arrayWithObjects:@"zhangyangyang", @"wuhe", @"liushanshan", @"yanglin", @"wangjunmin", nil];
    [arr00 sortUsingSelector:@selector(compare:)];
    NSLog(@"%@", arr00);
    // 对对象进行排序
    // 新建四个人的对象
    Person *p1 = [Person baseWithName:@"yanglin" sex:@"m"];
    Person *p2 = [Person baseWithName:@"wuhe" sex:@"m"];
    Person *p3 = [Person baseWithName:@"cuimou" sex:@"f"];
    Person *p4 = [Person baseWithName:@"shangshuai" sex:@"m"];
    // 用字面量创建对象和遍历构造器创建是一样的
    NSArray *pArr = @[p1, p2, p3, p4];
    // 以学生的姓名作为排序的依据
    NSArray *newArr0 = [pArr sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
        return [obj1.name compare:obj2.name];
        // 想打出从大到小的顺序就在[]前加上一个负号'-'
    }];
    for (Person *p in newArr0) {
        NSLog(@"%@", p.name);
    }
    NSLog(@"******************");
    NSMutableArray *mArr = [NSMutableArray arrayWithObjects:p1, p2, p3, p4, nil];
    [mArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        // (Person *)obj1:类型转换 obj1 -> Person
        Person *per1 = (Person *)obj1;
        Person *per2 = (Person *)obj2;
        return [per1.name compare:per2.name];
    }];
    for (Person *per in mArr) {
        NSLog(@"%@", per.name);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值