![]() |
1
139
我想再详细解释一下,给出一个更完整的答案。首先,让我们考虑下面的代码:
如果你运行这个,你会看到
那么,为什么呢?嗯,那个
定义块时,编译器实际上在堆栈上创建一个结构,其形式如下:
然后该块就是指向此结构的指针。第四名成员,
因此,当调用一个块时,处理器获取该块的地址,添加12,并尝试加载保存在该内存地址的值。然后它试图跳到那个地址。但如果块为零,它将尝试读取地址
现在,它必须是这样的崩溃,而不是像Objective-C消息调用那样无声地失败,这实际上是一种设计选择。由于编译器正在做决定如何调用块的工作,因此在调用块的任何地方都必须注入nil检查代码。这将增加代码大小并导致不良的性能。另一种选择是使用蹦床进行零位检查。然而,这也会招致性能惩罚。Objective-C消息已经通过了一个蹦床,因为它们需要查找将实际调用的方法。运行时允许方法的延迟注入和方法实现的更改,因此它已经经历了一个蹦床。在这种情况下,进行零检查的额外处罚并不重要。 我希望这有助于解释这一理论的基本原理。 |
![]() |
2
39
马特·盖洛韦的回答是完美的!读得好! 我只是想补充一下,有一些方法可以让生活更轻松。可以这样定义宏:
它可以采用0_“n个参数。使用示例
如果 你想得到 块的返回值 而且您不确定该块是否存在,那么最好只键入:
这样就可以轻松地定义回退值。在我的例子中,“nil”。 |
![]() |
3
8
警告:我不是方块专家。
阻碍
是
objective-c objects
但是打电话给
block is
not
a message
尽管你仍然可以尝试
希望这(以及链接)能有所帮助。 |
![]() |
4
2
这是我最简单、最好的解决方案也许有可能用这些c var参数编写一个通用的run函数,但我不知道如何编写它。
|