首页 > 代码库 > iOS中block的使用详解
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”静态变量区地址
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”静态变量区地址
iOS中block的使用详解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。