2017-03-28 72 views
4

當我嘗試轉換WKNSURLRequest(以及其他類,全部來自WebKit框架)時,我遇到了嚴重的崩潰。崩潰投射WKNSURLRequest爲?其他類型

例如在操場:

import UIKit 
import WebKit 

final class Sigh: NSObject { } 

NSClassFromString("NSObject") as? Sigh.Type 

NSClassFromString("WKNSURLRequest") as? Sigh.Type 

從NSObject的演員工作(即返回nil),但是從WKNSURLRequest投與EXC_BAD_ACCESS崩潰 - 我會認爲它會返回nil爲好。

任何人有任何想法可能會導致此?

回答

3

WKNSURLRequest不會NSObject

@interface WKNSURLRequest : WKObject <NSCopying> 

而且WKObject繼承是根類:

NS_ROOT_CLASS 
@interface WKObject <WKObject> 

不像Java中,所有類必須從Object inerhit,OBJ-C不需要所有類都從NSObject繼承。對象C橋明確支持NSObject,因此也是它的子類,但我不確定它能否同樣處理所有其他根對象。在出口端(暴露於Obj-C的Swift類)甚至不可能創建自己的根類。一個迅速的類將暴露給Obj-C只需必須繼承NSObject,所以我會說這個橋沒有設計任意根類。

當然,這些都沒有解釋崩潰,這可能只是Swift編譯器或Swift運行時中的一個簡單錯誤。由於你沒有靜態引用這些類,而只是通過它們的名字來引用這些類,所有事情都是在運行時發生的,Swift運行時可能會假定無論NSClassFromString返回的是NSObject的一個子類,然後當它嘗試與該類交互時,因爲這個假設是錯誤的。在這種情況下,它仍然是一個錯誤恕我直言,但它可以解釋爲什麼有一個崩潰。

+0

NSClassFromString的返回值是一個AnyClass。我們正在檢查NSClassFromString的返回值,而不是類本身。你可以用NSProxy做同樣的實驗,它不會崩潰。運行時沒有中斷,我很快就會證明我很快就會打開另一個問題。我會在這裏發佈鏈接,因爲我希望你對此發表看法。 –

+0

@GiuseppeLanza我希望你的意思是說「NSClassFromString的返回是一個AnyClass?」 ;-)並且'NSProxy'不會崩潰也可能意味着該橋明確支持它('NSProxy'是一個非常重要的標準類,不包含Swift無法與Obj-C一起使用)。我知道很多在'id'類型的對象上調用'isKindOfClass:'或'respondsToSelector:'的Obj-C代碼,請注意,他的將會崩潰的根類不執行這些方法(他們不必) - 如果你想真正保存,你可以用一個未知的Obj-C課程做很少的事情。 – Mecki

+0

當你有空時,你會給我你的意見嗎? http://stackoverflow.com/q/43280615/1754559 –

相關問題