我开始使用块了很多,很快就注意到了零块导致总线错误:为什么nil/NULL块在运行时会导致总线错误?
typedef void (^SimpleBlock)(void);
SimpleBlock aBlock = nil;
aBlock(); // bus error
这似乎违背的Objective-C的日常行为,忽略消息无对象:
NSArray *foo = nil;
NSLog(@"%i", [foo count]); // runs fine
因此,我不得不求助于通常为零检查之前,我使用块:
if (aBlock != nil)
aBlock();
或者使用虚拟块:
aBlock = ^{};
aBlock(); // runs fine
还有其他的选择吗?为什么零块不能简单地是一个nop?
谢谢你,有趣的链接。我知道调用一个块与发送一条消息并不相同,但从概念上讲,如果nil块与nil对象一样宽容,那将会很好。 – zoul 2010-11-10 14:22:42
您可以将类别添加到'__block'类型中......但我不确定。 '#define nilBlock^{}'也可能让你的生活更轻松。 – 2010-11-10 14:25:05
我想过'nilBlock'方法,不幸的是打字遇到了困难 - 为每个块类型创建一个单独的nil值并不是很有趣。 – zoul 2010-11-10 14:30:17