我剛剛遇到在Three20一些代碼,看起來像這樣:爲什麼在運行時使用performSelector:withObject:withObject如果您在編譯時知道選擇器及其參數?
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate performSelector:sel withObject:self withObject:(id)_cellViews.count-1];
}
在LLVM 2.0,這會導致編譯錯誤:
error: arithmetic on pointer to interface 'id', which is not a constant size in non-fragile ABI
我知道這是爲什麼錯誤發生和我知道如何解決它。我只需要直接調用該方法,像這樣:
SEL sel = @selector(textField:didAddCellAtIndex:);
if ([self.delegate respondsToSelector:sel]) {
[self.delegate textField:self didAddCellAtIndex:(_cellViews.count - 1)];
}
我的問題是,如果你知道這兩個選擇和它在編譯時的參數,你爲什麼會需要在運行時使用performSelector:withObject:withObject:
?我不明白爲什麼代碼是這樣寫的。如果選擇器和參數被動態傳遞到方法中,我可能會理解,但它們不是,選擇器和它的參數是硬編碼的(即使索引在運行時發生了變化,它獲取索引的方法很難編碼)。
如果有人可以向我解釋爲什麼這將是必要的一個很好的理由,我會很感激。否則,我會在這裏更改所有這些代碼。
Three20不應該傳遞一個整數值作爲指針。淘氣,淘氣。感謝您的修復。 – justice 2011-09-08 13:36:41