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

ran*_*its 5 objective-c objective-c-blocks

谁能解释这个块语法是如何工作的?

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

这个街区的名称是什么?为什么要复制块然后自动释放?我对这里发生的事情感到困惑..据说该块返回AStreamBuilder,但是在块体内它返回一个NSInputStream实例.

任何人都可以打破这个吗?

小智 9

这是块:

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

它没有收到任何参数(因此(void)),它返回一个实例NSInputStream.请注意,它没有"名称" - 与此相同,例如:

[[NSNumber alloc] initWithInt:42];
Run Code Online (Sandbox Code Playgroud)

也没有"名字".

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

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

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

AStreamBuilder stream_builder = …
Run Code Online (Sandbox Code Playgroud)

所以它很可能AStreamBuilder是一个typedef没有接收参数并且具有返回类型NSInputStream(或与之兼容的类型)的块.请注意,这AStreamBuilder是块类型,而不是块返回的值的类型.就像是:

typedef NSInputStream * (^AStreamBuilder)(void);
Run Code Online (Sandbox Code Playgroud)