iOS中block的使用详解

第一、block的使用
1、截获自动变量的值
typedef void(^TEST)(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TEST test;
         NSString *sample=@"hello";
        test=^{
            NSLog(@"%@",sample);
        };
        sample=@"name";
        NSLog(@"%@",sample);
        test();
    }
      return 0;
}
执行结果:
2014-12-26 11:55:49.172 TEST[1262:303] name
2014-12-26 11:55:49.173 TEST[1262:303] hello
2、__block的使用
typedef void(^TEST)(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TEST test;
        __block NSString *sample=@"hello";
        test=^{
            sample=@"what";
            NSLog(@"%@",sample);
        };
        sample=@"name";
        NSLog(@"%@",sample);
        test();
    }
      return 0;
}
执行结果:
2014-12-26 11:51:02.532 TEST[1202:303] name
2014-12-26 11:51:02.534 TEST[1202:303] what
注意如果不使用__block关键词,则会编译出错

3、截获的自动变量的地址
typedef void(^TEST)(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TEST test;
        id array=[NSMutableArray new];
        test=^{
            NSDictionary *temp=@{@"key":@"value"};
            [array addObject:temp];
            NSLog(@"%@",array);
        };
        test();
    }
      return 0;
}
结果:2014-12-26 11:59:05.941 TEST[1306:303] (
        {
        key = value;
    }
)
说明:array 为NSMutableArray对象地址,在block函数中改地址并没有改变,所以是正确的
如果是如下:
  TEST test;
        NSMutableArray *arr=[[NSMutableArray alloc] init];
        test=^{
            arr=[[NSMutableArray alloc] init];
        };
        test();
arr要改变地址,所以编译错误
如果是如下实例:
 NSString *str1=@"strstr";
        id array=[NSMutableArray new];
        test=^{
            str1=@"hello";
        };
        test();

这是有错的,因为str1在block中地址发生变化了,刚开始指向的是静态变量去@“strstr”,现在指向了@“hello”静态变量区地址

4.block可以改变静态变量、静态全局变量和全局变量的值
int global_val=1;
static int static_global_val=2;
typedef void(^TEST)(void);
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TEST test;
        static int static_val=3;
        test=^{
            global_val=2;
            static_global_val=3;
            static_val=4;
        };
        test();
        NSLog(@"the global_val value is %d",global_val);
        NSLog(@"the static_global_val value is %d",static_global_val);
        NSLog(@"the static_val value is %d",static_val);
            }
      return 0;
}

结果:

2014-12-30 15:19:40.359 TEST[7697:303] the global_val value is 2

2014-12-30 15:19:40.361 TEST[7697:303] the static_global_val value is 3

2014-12-30 15:19:40.362 TEST[7697:303] the static_val value is 4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值