Objective-C---6---Block

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中的字面量:

字面量是⼀种新型的写法,能在⼀定程度上简化代码。

字面量创建的对象是便利构造的,且是不可变的。

例如:字典,集合,字符串,数组,等的简单创建就是使用了字面量



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值