gpt4 book ai didi

swift - AutoreleasingUnsafeMutablePointer 崩溃 - 编译器中的错误?

转载 作者:可可西里 更新时间:2023-11-01 02:19:12 24 4
gpt4 key购买 nike

我正在慢慢地将我的代码库迁移到 Swift 并遇到了一个奇怪的崩溃,我正在填充一个 AutoreleasingUnsafeMutablePointer<String?>使用非零字符串。这是一些按比例缩小的代码:

extension String {
func getRegexVariableNamed(name: String, forRegexString regexString: String) -> String? {
/** ... **/
return "TO BE IMPLEMENTED".lowercaseString // Using lowercase to prevent the compiler from inlining
}
}

class XYZ {
func extractInformation(info1: AutoreleasingUnsafeMutablePointer<String?>, info2: AutoreleasingUnsafeMutablePointer<String?>, info3: AutoreleasingUnsafeMutablePointer<String?>, info4: AutoreleasingUnsafeMutablePointer<String?>, fromSource source: String) -> Bool {
guard let vp = source.getRegexVariableNamed("ID", forRegexString: "vp=(?P<ID>\\d+)") else {
return false
}

info4.memory = vp
info1.memory = "ABC"
info2.memory = "DEF"
info3.memory = "GHI" + vp
return true
}
}

// Code in playground
let obj = XYZ()

let info1 = AutoreleasingUnsafeMutablePointer<String?>()
let info2 = AutoreleasingUnsafeMutablePointer<String?>()
let info3 = AutoreleasingUnsafeMutablePointer<String?>()
let info4 = AutoreleasingUnsafeMutablePointer<String?>()
if !obj.extractInformation(info1, info2: info2, info3: info3, info4: info4, fromSource: "") {
print("NO")
}else{
print("YES")
}

应用程序(同样适用于 playground)崩溃并显示 error: Playground execution aborted: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

此异常发生在将字符串设置为 AutoreleasingUnsafeMutablePointer 时在方法中 extractInformation(...) .

在将此作为错误报告给 Apple 之前,我想检查一下我是否没有做错什么。

顺便说一句,我在 OS X 10.10.5 上使用最新的 Xcode 7 beta (6)。

P.S.:我知道更 Swift 的方法是制作一个返回结构的方法,而不是使用这些自动释放指针,但如前所述,我正在慢慢地从 ObjC 转移,所以我需要它(现在)到向后兼容。

最佳答案

使用 Xcode 7.0.1,我可以使您的代码正常工作,并进行一些更改。

首先,在Using Swift with Cocoa and Objective-C (Swift 2)指南(“自动释放指针”一章),它说声明为采用 AutoreleasingUnsafeMutablePointer<Type> 的函数可以接受 inout同样的表达 Type .

因此,代码可以更改如下:

let info1: String?
let info2: String?
let info3: String?
let info4: String?
if !obj.extractInformation(&info1, info2: &info2, info3: &info3, info4: &info4, fromSource: "") {
print("NO")
}else{
print("YES")
}

但是,还是不行。

但是,在同一页中,它表示 AutoreleasingUnsafeMutablePointer<Type>适用于 类型映射。我不知道这是否是它不起作用的原因,很难猜测后面发生了什么,但如果你更换 StringNSString , 你会得到一个结果。

extension String {
func getRegexVariableNamed(name: String, forRegexString regexString: String) -> String? {
/** ... **/
return "TO BE IMPLEMENTED".lowercaseString // Using lowercase to prevent the compiler from inlining
}
}

class XYZ {
func extractInformation(info1: AutoreleasingUnsafeMutablePointer<NSString?>,
info2: AutoreleasingUnsafeMutablePointer<NSString?>,
info3: AutoreleasingUnsafeMutablePointer<NSString?>,
info4: AutoreleasingUnsafeMutablePointer<NSString?>,
fromSource source: String) -> Bool {
guard let vp = source.getRegexVariableNamed("ID", forRegexString: "vp=(?P<ID>\\d+)") else {
return false
}

info4.memory = vp
info1.memory = "ABC"
info2.memory = "DEF"
info3.memory = "GHI" + vp
return true
}
}

// Code in playground
let obj = XYZ()

var info1: NSString?
var info2: NSString?
var info3: NSString?
var info4: NSString?
if !obj.extractInformation(&info1, info2: &info2, info3: &info3, info4: &info4, fromSource: "") {
print("NO")
}else{
print("YES")
info1 // "ABC"
info2 // "DEF"
info3 // "GHIto be implemented"
info4 // "to be implemented"
}

关于swift - AutoreleasingUnsafeMutablePointer<String?> 崩溃 - 编译器中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32307825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com