在Objective-C中,我知道块被视为对象,因此我想知道是否可以将它们存储在数组中。这就引出了一个问题,是块头等对象还是为了在对象之间传递它们而像对象一样对待它们?如果它们是一流的对象,那么它们不应该可存储在数组中吗?

最佳答案



我保留了原始答案,因为它包含一些有趣的技术细节。



块是Objective-C对象,它们的行为与其他NSObject相似,但有两个主要区别:

  • 块始终由编译器生成。当执行通过块声明时,它们在运行时有效地“分配/初始化”。
  • 块最初是在堆栈上创建的。如果Block要超过当前作用域,则必须使用Block_copy()或copy方法将其移动到堆中(请参见下面的ARC点)。
  • 除了内存管理,块实际上没有可调用的API。
  • 要将块放入,必须首先将其复制到。总是。包括根据ARC。 (请参阅注释。)否则,存在分配给堆栈的块Block为autoreleased的风险,并且您的应用程序稍后将崩溃。
  • 复制基于堆栈的块也将复制所有捕获的状态。如果要制作一个块的多个副本,则将其复制一次再复制会更有效(因为复制副本只会增加保留计数,因为块是不可变的)。
  • 在ARC下,从方法或函数返回Block的“效果很好”;它将被自动复制到堆中,并且返回将有效地成为自动释放的块(在某些情况下,编译器可能会优化自动释放)。即使使用ARC,您仍然需要复制该块,然后再将其粘贴到集合中。

  • 我写了一些博客文章,都提供了introduction to blocks和一些tips and tricks。您可能会发现它们很有趣。

    而且,是的,在字典中添加'em'非常有用。我编写了几段代码,将块放入字典中作为命令处理程序,其中的关键是命令名称。非常便利。

    关于objective-c - 在阵列中存储块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7997666/

    10-11 22:00
    查看更多