2011-06-17 44 views
5

任何人都可以解释这个块的语法是如何工作的吗?Objective-C块语法 - 有人可以解释这一点吗?

AStreamBuilder stream_builder = [ [ ^(void) 
    { 
     // some more code.. 
     return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; 
    } copy ] autorelease ]; 
    return stream_builder; 

这里的块名称是什么?为什么该块被复制,然后自动释放?我有点困惑这里发生了什么......该块据说返回AStreamBuilder,但在块体内返回一个NSInputStream的实例。

任何人都可以解决这个问题吗?

回答

9

这是块:

^(void) 
    { 
     // some more code.. 
     return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; 
    } 

它不接受任何参数(因此(void))并返回的NSInputStream一个实例。请注意,它没有“名称” - 例如:

[[NSNumber alloc] initWithInt:42]; 

也没有“名称”。

由于在堆栈上创建了块,如果您需要返回一个块,则必须将其从堆栈复制到堆(因此-copy)。这是一个拥有的对象;为了返回,这不是由呼叫者所拥有的对象,所述块被自动释放(因此-autorelease):

[ [ ^(void) 
    { 
     // some more code.. 
     return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ]; 
    } copy ] autorelease ]; 

所以上面的摘录是从堆叠的堆复制的自动释放块。它被分配给一个变量

AStreamBuilder stream_builder = … 

所以很可能是因为AStreamBuilder为接收没有参数和具有返回类型NSInputStream(或类型与尺寸)的块的typedef。请注意,AStreamBuilder是块类型,与块返回的值的类型相反。喜欢的东西:

typedef NSInputStream * (^AStreamBuilder)(void); 
0

正在复制该块以将其从堆栈移动到堆。如果您想在创建范围之外使用该块,则这是必需的。

4

什么是这里的块的名字吗?

新块被分配给变量stream_builder。它本身没有名称,因为块是“anonymous inline collection of code

块为什么被复制然后自动释放?

因为它将在当前范围(从方法/函数返回)后被保留。因此它需要是copied to the heap

块是说要回AStreamBuilder但块体内部返回NSInputStream的实例

的功能/方法,你在(与return stream_builder;结束一个)是返回AStreamBuilder(=新创建的块)。该块本身将在invoked未来某个时间返回NSStream

+0

如果块要返回一个NSStream的实例,那么在上面的语法中怎么没有声明返回类型? – randombits

+1

这是因为你看到的'void'不是返回值,而是参数。这个块没有任何参数。返回类型在这里没有指定。这是可以的,因为“[返回​​类型是可选的,并从返回语句中推断出来。](http://clang.llvm.org/docs/BlockLanguageSpec.txt)” – puzzle

+0

@rand有两件事发生在那里:在一方面,正如拼图所说,返回类型是从返回语句中推断出来的。另一方面,'AStreamBuilder'是一个'typedef',它定义了块的返回类型。为使分配生效,推断的返回类型必须与'AStreamBuilder'中定义的返回类型相匹配。您可以在Xcode中右键单击并选择Jump to Definition来检查“AStreamBuilder”的声明。 – 2011-06-17 23:52:16

相关问题