2

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

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>

4

1 回答 1

2

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

NSLog(@"%@", print_block);

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

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

以下代码按您的预期工作:

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

NSLog(@"%@", print_block());
于 2012-07-27T16:28:31.203 回答