我開始使用塊了很多,很快就注意到了零塊導致總線錯誤:爲什麼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