我希望从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 ...