float pi = 3.14;
float (^piSquare)(void) = ^(void){ return pi * pi; };
float (^piSquare2)(void) = ^(void){ return pi * pi; };
[piSquare isEqualTo: piSquare2]; // -> want it to behave like -isEqualToString...
最佳答案
扩展 Laurent 的回答。
block 是实现和数据的组合。要使两个 block 相等,它们需要具有完全相同的实现并捕获完全相同的数据。因此,比较需要比较实现和数据。
人们可能认为比较实现很容易。这实际上不是因为编译器优化器的工作方式。
虽然比较简单数据相当简单,但 block 可以捕获对象——包括 C++ 对象(某天可能真的有用)——比较可能需要也可能不需要考虑到这一点。天真的实现会简单地对捕获的内容进行字节级比较。然而,人们可能还希望使用对象级比较器来测试对象的相等性。
然后是__block变量的问题。 block 本身实际上没有任何与 __block 捕获的变量相关的元数据,因为它不需要它来满足所述变量的要求。因此,在不显着更改编译器代码生成的情况下,比较无法比较 __block 值。
所有这些都是说,不,目前不可能比较 block 并概述其中的一些原因。如果您觉得这很有用,请通过 http://bugreport.apple.com/ 提交错误并提供一个用例。
关于objective-c - 是否可以按内容比较两个 Objective-C block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167932/