任何人都可以解释这种块语法是如何工作的吗?
AStreamBuilder stream_builder = [ [ ^( void )
{
// some more code..
return (NSInputStream *)[ NSInputStream inputStreamWithFileAtPath: some_path ];
} copy ] autorelease ];
return stream_builder;
这里街区的名称是什么?为什么要复制块然后自动释放?我对这里发生的事情感到困惑..据说这个块返回AStreamBuilder,但是在块体内它返回一个NSInputStream实例。
有人可以打破这个吗?
答案 0 :(得分: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
对于没有接收参数且返回类型为typedef
(或与之兼容的类型)的块而言NSInputStream
可能是AStreamBuilder
。请注意,typedef NSInputStream * (^AStreamBuilder)(void);
是块类型,而不是块返回的值的类型。类似的东西:
{{1}}
答案 1 :(得分:4)
这里街区的名称是什么?
新块被分配给变量stream_builder
。由于块是“anonymous inline collection of code”
为什么要复制块然后自动释放?
因为它将在当前作用域之后保留(从方法/函数返回)。因此,它必须是copied to the heap。
该块据说返回AStreamBuilder但是在块体内它返回一个NSInputStream实例
您所在的函数/方法(以return stream_builder;
结尾的函数/方法)返回AStreamBuilder
(=新创建的块)。该块本身将在invoked的某个时间点返回NSStream
。
答案 2 :(得分:0)
正在复制块以将其从堆栈移动到堆中。如果要在创建它的范围之外使用块,则需要这样做。