检查NSArray中是否存在特定块是否安全?假设我们有这个代码:
int (^blockA)(int) = ^(int x) {
return x;
};
int (^blockB)(int) = ^(int x) {
return x;
};
NSArray *array = [NSArray arrayWithObjects:[blockA copy], [blockB copy], nil];
if ([array containsObject:blockA]) {
NSLog(@"Idx: %d", [array indexOfObject:blockA]);
}
if ([array containsObject:blockB]) {
NSLog(@"Idx: %d", [array indexOfObject:blockB]);
}
我得到的输出是:
Idx: 0
Idx: 1
所以它似乎正在工作,但我不确定为什么,特别是因为数组包含其实现相同的原始块的副本。每个块都有一些内部标识符或什么?详细说明为什么会这样做。
答案 0 :(得分:1)
blockA和[blockA copy]通常不是同一个对象,因此[array containsObject:blockA]不太可能返回YES。在将其添加到数组之前,您必须编写例如blockA = [blockA copy] 。
答案 1 :(得分:0)
containsObject:
NSArray
方法使用isEqual:
进行比较,它不会检查指针是否相等。 isEqual也适用于块,如本例所示:
void (^block)(void) = ^{
NSLog(@"Some Block");
};
__typeof(block) b = [block copy];
NSLog(@"%i", [b isEqual:block]);
这将打印1
。