AutoreleasingUnsafeMutablePointer <string?>崩溃 - 编译器中的错误?

时间:2015-08-31 09:19:50

标签: swift cocoa swift2 xcode7 xcode7-beta6

我慢慢地将我的代码库迁移到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")
}

应用程序(同样适用于游乐场)与error: Playground execution aborted: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

崩溃

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

在我向Apple报告此错误之前,我想检查一下我是否做错了。

BTW我在OS X 10.10.5上使用最新的Xcode 7 beta(6)。

PS:我知道更多的Swift-ly方法是创建一个返回结构而不是使用这些自动释放指针的方法,但如上所述,我正慢慢从ObjC移动,所以我需要它(现在)到向后兼容。

1 个答案:

答案 0 :(得分:1)

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

首先,在Using Swift with Cocoa and Objective-C (Swift 2)指南(“自动释放指针”一章)中,它表示声明为AutoreleasingUnsafeMutablePointer<Type>的函数可以接受同一个inout表达式{ {1}}。

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

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>取代String,你就会得到一个结果。

NSString