带有损坏对象的Swift EXC_BAD_ACCESS



由于某些奇怪的原因,我遇到了EXC_BAD_ACCESS,特别是在展开和引用字段时。(可在Xcode 7 GM上复制)

相关代码如下:

// FIXME: BUGGY
let conv_id = client_conversation.conversation_id //!.id
print("ABOUT TO DIE: (conv_id?.id)")
if conv_id!.id as? String != nil {
    conv_id!.id = "hi"
}

print()语句处崩溃。不知道我能做些什么来解决这个问题。我已经尝试了malloc()调试,僵尸对象,并通过回溯手工调试。

我添加了这些对象的定义:

class Message : NSObject {
    required override init() {
        super.init()
    }
}
class CONVERSATION_ID : Message {
    var id: NSString = ""
}
class CLIENT_CONVERSATION : Message {
    var conversation_id: CONVERSATION_ID?
    var type = ConversationType()
    var name: NSString?
    var self_conversation_state = CLIENT_CONVERSATION_INTERNAL_STATE()
    var read_state = [CLIENT_CONVERSATION_READ_STATE]()
    var current_participant = [USER_ID]()
    var participant_data = [CLIENT_CONVERSATION_PARTICIPANT_DATA]()
}

另一个例子:当print(conv_id!)打印

(
    "sample string"
)

我似乎不能直接访问字符串

任何时候你说!都是在邀请崩溃。重写你的代码,使!永远不会出现。了解你的选择,并安全地打开每一个。了解如何在展开前比较Optional和nil,或者如何使用if let结构。

另外,请注意这一行完全是无意义的(我称之为"假强制转换"):

if conv_id!.id as? String != nil {

NSString 总是 String;我很惊讶编译器没有警告你这一点。因此,测试是没有意义的。

因此你的代码应该是这样的:
let conv_id = client_conversation.conversation_id
conv_id?.id = "hi"

注意这里没有假强制转换和感叹号

相关内容

  • 没有找到相关文章

最新更新