objective-c - 是否可以按内容比较两个 Objective-C block ?

标签 objective-c comparison objective-c-blocks

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/

相关文章:

c++ - < 运算符在不应该返回 true 时返回 true

ios - 如何在 Next ViewController 中结束完成 block

ios - Objective-C 命名 block 的参数

c# - ( 0 < 0 ) 是否返回真?

javascript - 返回奇数个数

ios - 一个棘手的 Objective-C block 行为

ios - 从任意位置播放声音

ios - 找不到符号 : kUTTypeImage

java - 我可以使用 React Native 的异步存储从本地存储中获取值吗?

ios - 为什么加载数据指示器无法正常工作?