11

在 Snow Leopard 中引入的阻止对象的其中一项适用于以前通过回调处理的情况。传递上下文的语法要干净得多。但是,我还没有看到任何有关以这种方式使用块的性能影响的信息。使用块时我应该注意哪些性能缺陷(如果有的话),特别是作为 C 风格回调的替代品?

4

2 回答 2

11

块运行时看起来非常紧凑。块描述符和函数是静态分配的,因此它们可以扩大程序的工作集,但您只需为从封闭范围引用的变量“支付”存储费用。非全局块文字和__block变量是在堆栈上构造的,没有任何分支,因此您不太可能因此而减速。调用一个块只是result = (*b->__FuncPtr)(b, arg1, arg2);这相当于result = (*callback_func_ptr)(callback_ctx, arg1, arg2)

如果您将块视为“编写自己的上下文结构并为您处理丑陋的打包、内存管理、强制转换和取消引用的回调”,我想您会意识到块在运行时的成本很低,并且在编程时间。

于 2010-04-21T04:56:14.293 回答
6

您可能想查看这篇博文这篇博文。块被实现为Objective-C对象,除了它们可以放在堆栈上,所以它们不一定是malloc'd(如果你保留对块的引用,它会被复制到堆上)。因此,它们可能会比大多数 Objective-C 对象执行得更好,但与简单的回调相比,性能会受到轻微影响——我猜 95% 的情况下它不应该是一个问题。

于 2010-04-21T04:42:20.927 回答