谁能解释该块语法的工作原理?

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

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

任何人都可以分解吗?

最佳答案

这是块:

^( 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);

关于Objective-C块语法-有人可以解释吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6392626/

10-10 20:46