Objective-C块语法 – 有人能解释一下吗?

Objective-C block syntax - can someone explain this?

有人能解释这个块语法是如何工作的吗?

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

这里的街区叫什么?为什么要复制块然后自动释放?我对这里发生的事情有点困惑。据说该块返回astreambuilder,但在块体内部它返回nsinputstream的一个实例。

有人能把这个分解吗?


这是块:

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

它不接收任何参数(因此(void)),并返回NSInputStream的实例。请注意,它没有"名称",这与以下含义相同:

1
[[NSNumber alloc] initWithInt:42];

也没有"名称"。

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

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

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

1
AStreamBuilder stream_builder =

因此,对于不接收参数并且返回类型为NSInputStream的块(或与之兼容的类型),AStreamBuilder可能是typedef。注意,AStreamBuilder是块类型,而不是块返回的值类型。类似:

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

What's the name of the block here?

新块分配给变量stream_builder。它本身没有名称,因为块是"匿名内联代码集合"

Why is the block being copied and then autoreleased?

因为它将保留在当前作用域之后(从方法/函数返回)。因此需要将它复制到堆中。

the block is said to return AStreamBuilder but inside the body of the block it returns an instance of NSInputStream

您所在的函数/方法(以return stream_builder;结尾的函数/方法)返回AStreamBuilder(即新创建的块)。当将来某个时候调用时,块本身将返回一个NSStream


正在复制块以将其从堆栈移动到堆。如果要在创建块的作用域之外使用该块,则需要执行此操作。