崩溃铸造WKNSURLRequest为?其他类型

时间:2017-03-28 15:01:33

标签: swift casting

当我尝试使用WKNSURLRequest(和其他类,都来自WebKit框架)时,我遇到了严重的崩溃。

e.g。在操场上:

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

任何人都有任何想法可能导致这个?

1 个答案:

答案 0 :(得分:3)

WKNSURLRequest不会继承NSObject

@interface WKNSURLRequest : WKObject <NSCopying>

WKObject是一个根类:

NS_ROOT_CLASS
@interface WKObject <WKObject>

与Java不同,所有类必须来自Object,Obj-C不要求所有类都从NSObject继承。

Swift&lt; - &gt; Obj-C桥接器明确支持NSObject,因此也支持其子类,但我不确定它是否可以同样好地处理所有其他根对象。在导出方面(Swift类暴露给Obj-C),甚至不可能创建自己的根类。一个快速的类应该暴露给Obj-C,只需必须继承自NSObject,所以我要说这个桥的设计没有任意根类。

当然,这些都没有解释崩溃,这可能只是Swift编译器或Swift运行时中的一个简单错误。由于您没有静态引用类,而只是按名称引用类,所有内容都在运行时发生,Swift运行时可能只是假设NSClassFromString返回的是NSObject的子类,然后它尝试进行交互使用该类,这将在运行时失败,因为这个假设是完全错误的。在那种情况下,它仍然是一个错误恕我直言,但它可以解释为什么会发生崩溃。