检查NSArray是否包含块

时间:2014-04-24 08:55:37

标签: objective-c

检查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

所以它似乎正在工作,但我不确定为什么,特别是因为数组包含其实现相同的原始块的副本。每个块都有一些内部标识符或什么?详细说明为什么会这样做。

2 个答案:

答案 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