为什么这个基本的Objective C-block代码不起作用?

时间:2012-07-27 16:19:58

标签: objective-c block

我试图了解块的基本原理。我写了这个简单的测试:

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>

1 个答案:

答案 0 :(得分:2)

Vatev的评论是正确的。当你写:

NSLog(@"%@", print_block);

您正在传递块print_block作为日志语句中格式字符串的参数。你正试图打印块。这可能会导致[print_block description]被调用。我不知道块是否实现了-description方法,但如果没有,那么你将得到一个无法识别的选择器异常。

此外,您声明阻止的方式不正确。您不需要在参数列表中包含返回值。

以下代码按预期工作:

NSString *(^print_block)() = ^{
    return @"this block worked!";  
};

NSLog(@"%@", print_block());