由于某些奇怪的原因,我遇到了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"
注意这里没有假强制转换和感叹号