我試圖調試iOS上的崩潰,在支持A64 instruction set的設備上一致地重現。特別是使用SoC的A7/A8X的iPad。在任何32位iPad上運行時,完全相同的代碼也會一致而不是崩潰(如果我將構建限制爲只有32位體系結構,然後在具有64位功能的iPad上運行32位代碼)。A64:objc_msg發送崩潰,而performSelector:withObject:工作
的崩潰報告爲EXC_BAD_ACCESS
,並沒有什麼特別花哨的有關代碼觸發它:
if (object && [self respondsToSelector:addSelector]) {
objc_msgSend(self, addSelector, object); //EXC_BAD_ACCESS on A64 devices!
//[self performSelector:addSelector withObject:object]; //no crash
}
的違規行爲objc_msgSend(self, addSelector, object);
。第一個令人困惑的部分是,如果我用[self performSelector:addSelector withObject:object];
代替這一行,一切都按照它應該的方式工作(儘管它給我留下了令人厭惡的「PerformSelector可能導致泄漏......」警告)。除非我完全誤解了某些內容,否則objc_msgSend
和performSelector:withObject:
在本例中應該基本上相同。
那麼爲什麼一個崩潰(只有當使用A64),而另一個不崩潰?
下一個令人困惑的事情是當它發生時嘗試調試崩潰。 self
和object
都是NSManagedObject
實例,我可以在調試器中觀察到它們都是有效的對象。然而,異常不約而同地報道:
-[NSManagedObjectContext entity]: unrecognized selector sent to instance 0x...
呼叫被顯示爲從CoreData
的內部發起,我不能拿出那怎麼可能會發生的任何合理的解釋,特別是從32位轉換到64位體系結構/構建的副作用。
有什麼想法會導致這種問題?或者我應該去那個performSelector:withObject:
,並開心?
你使用的SQLite數據庫類型? –
@WarrenBurton - 是的,應用程序在CoreData中使用'NSSQLiteStoreType'。 – aroth
什麼是addSelector? –