【发布时间】:2014-08-01 22:12:59
【问题描述】:
在 Xcode6 beta 1 中,与此类似的方法有效,但在 Xcode6 beta 4 中出现错误。修复错误后,我的无错误代码如下
用于背景:
我在这里使用的类实现了ABPeoplePickerNavigationControllerDelegate,它允许用户从通讯录中选择一个联系人。我想收到添加到该人的第一封电子邮件。
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!) {
var emails = ABRecordCopyValue(person, kABPersonEmailProperty)
var emailsObj = emails.takeUnretainedValue() as AnyObject
var index = 0 as CFIndex
var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)
println(emailAddress)
}
但是当我编译时,我得到了构建失败:
Bitcast 要求两个操作数都是指针或两者都不是 %80 = bitcast %objc_object* %79 到 %PSs9AnyObject_, !dbg !860 存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %80, %objc_object** %81, 对齐 4, !dbg !860 %objc_object*存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %80, %objc_object** %85, 对齐 4, !dbg !864 %objc_object*LLVM 错误:发现损坏的函数,编译中止! 命令 /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为 1
可疑行是:
var emailsObj = emails.takeUnretainedValue() as AnyObject
var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)
当我将代码更改为
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!) {
var emails = ABRecordCopyValue(person, kABPersonEmailProperty)
var emailsObj:AnyObject? = emails.takeRetainedValue() as AnyObject
var index = 0 as CFIndex
var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)
println(emailAddress)
}
错误缩短为
Bitcast 要求两个操作数都是指针或两者都不是 %79 = bitcast %objc_object* %78 到 %PSs9AnyObject_, !dbg !856 存储值类型与指针操作数类型不匹配! 存储 %PSs9AnyObject_ %79, %objc_object** %80, 对齐 8, !dbg !856 %objc_object*LLVM 错误:发现损坏的函数,编译中止! 命令 /Applications/Xcode6-Beta4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift 失败,退出代码为 1
提前感谢您的帮助
亚伦
【问题讨论】:
-
我看到了你对另一个问题的评论,但很遗憾我在这里帮不了你太多。我还没有专门的时间来学习 Swift。但是,这里有一个很长的猜测:如果将
takeUnetainedValue()替换为takeRetainedValue(),它仍然会失败吗?另外,我的操场指示我将emailsObj行更改为var emailsObj: AnyObject = emails.takeRetainedValue() as AnyObject,这可能与您的问题有关。 -
遗憾的是这不起作用,但仅供参考,您对 takeUnretained() 和 takeRetainedValue() 之间的区别有什么了解吗?我不太了解文档
-
@Aaron 如果一个函数的名称使用 Create 或 Copy,它会被保留,并且需要释放,所以如果 Swift 有疑问,你告诉它把值作为保留。否则它是不保留的。但是,如果 Swift 没有任何疑问,那么你什么也不应该做。
-
@matt 谢谢,当我将其更改为
var emailsObj:AnyObject? = emails.takeRetainedValue() as AnyObject时,它似乎减少了输出错误的长度(减少了两行),但只有当我添加?时,其余的错误仍然存在即使var emailAddress = ABMultiValueCopyValueAtIndex(emailsObj, index)被注释掉。 -
这是一个解决方案 - 但它真的很奇怪:stackoverflow.com/a/24971793/341994 显然这个模块没有很好地桥接到 Swift。你应该坚持使用 Objective-C 和/或提交错误报告。