Swift:ObjectiveC RunTime无法识别值类型的copyWithZone错误

时间:2016-02-18 16:45:57

标签: ios swift runtime copywithzone

我希望从Swift迁移一些代码 - >目标C从单元测试开始。

我遇到了模拟传递值类型的函数的问题:

let initWithTitleBlock : @objc_block (String, String) -> AlertViewMock! = { (title : String, message : String) -> (AlertViewMock!) in
    alert = AlertViewMock(title: title, message: message)
    return alert
}
let initWithTitleImp = imp_implementationWithBlock(unsafeBitCast(initWithTitleBlock, AnyObject.self))
let initWithTitleMethod = class_getInstanceMethod(AlertView.self, Selector("initWithTitle:message:"))
method_setImplementation(initWithTitleMethod, initWithTitleImp)

但我最终在运行时收到以下错误:

  

- [AlertView copyWithZone:]:无法识别的选择器发送到实例0x7fef006e4cb0

但是,如果我将类型作为AnyObject或其他参考类型(如NSURL)更改为块,我可以成功运行新块(除了我无法将对象转换回来)到一个字符串):

let initWithTitleBlock : @objc_block (AnyObject, AnyObject) -> AlertViewMock! = { (title : AnyObject, message : AnyObject) -> (AlertViewMock!) in ...

我没有将AlertViewMock标记为copy。愿任何人帮忙解释一下发生了什么吗?如果我传入NSInteger,我会得到同样的例外:

let initWithTitleBlock : @objc_block (NSInteger, NSInteger) -> AlertViewMock! = { (title : NSInteger, message : NSInteger) -> (AlertViewMock!) in ...

0 个答案:

没有答案