ObjC运行时:伪造块ivars

时间:2012-12-10 19:24:07

标签: objective-c runtime block

我写了这段代码:

NSAlert *alert = [NSAlert new];
objc_setAssociatedObject(alert, @"block", aBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
if (![objc_getAssociatedObject(alert, @"block") isEqual:aBlock]) NSLog(@"failure");

其中aBlock是传递给调用上面代码的函数的void (^)(NSAlert *)块。现在:如果块不包含任何外部__block变量,一切正常,但如果它尝试设置这样的变量(例如,外部__block NSString *string),我得到{{1} } 信息。我该怎么办?

1 个答案:

答案 0 :(得分:3)

您的代码运行正常。块不一定等于它自身的副本 - 它依赖于实现。您可以将其简化为if (![aBlock isEqual:[aBlock copy]]) NSLog(@"Failure!"),您应该得到相同的结果。