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

时间:2011-06-17 22:58:01

标签: objective-c objective-c-blocks

任何人都可以解释这种块语法是如何工作的吗?

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

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

有人可以打破这个吗?

3 个答案:

答案 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)

正在复制块以将其从堆栈移动到堆中。如果要在创建它的范围之外使用块,则需要这样做。