我试图了解块的基本原理。我写了这个简单的测试:
NSString *(^print_block) () = ^ (NSString *returned_string){
return @"this block worked!";
};
NSLog(@"%@", print_block);
我预计控制台输出为"this block worked!"
,但我得到了大量的错误数字等等,结尾于:
terminate called throwing an exception
怎么了?
编辑:建议使用答案:
NSLog (@"%@", print_block());
但这也不起作用。程序在块定义开始时终止,控制台只显示(lldb)
,Xcode在块定义中放置一个绿色箭头。箭头显示:
Thread 1: EXC_BAD_ACCESS (code=1, address=0x5f646e71)
我尝试过其他不起作用的东西:
NSString *(^print_block) () = ^ (NSString *returned_string){
NSString *return_me = @"this block worked!";
return return_me;
};
NSLog(@"%@", print_block);
但至少这并没有终止该计划。它运行正常。但是控制台输出仍然是错误的:
<__NSGlobalBlock__: 0x5a58>
答案 0 :(得分:2)
Vatev的评论是正确的。当你写:
NSLog(@"%@", print_block);
您正在传递块print_block
作为日志语句中格式字符串的参数。你正试图打印块。这可能会导致[print_block description]
被调用。我不知道块是否实现了-description
方法,但如果没有,那么你将得到一个无法识别的选择器异常。
此外,您声明阻止的方式不正确。您不需要在参数列表中包含返回值。
以下代码按预期工作:
NSString *(^print_block)() = ^{
return @"this block worked!";
};
NSLog(@"%@", print_block());