По какой-то странной причине я сталкиваюсь с 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()
, объекты Zombie и отладку вручную через backtrace.
Я добавил определение этих объектов:
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"
)
Кажется, я не могу напрямую получить доступ к строке.
Каждый раз, когда вы говорите !
вы приглашаете крах. Перепишите свой код так, чтобы !
никогда не появляется. Знайте свои Опционы и разворачивайте каждый из них безопасно. Узнайте, как сравнить опцию с nil перед распаковкой или как использовать конструкцию if let
.
Кроме того, обратите внимание, что эта строка - полная глупость (то, что я называю "ложным приведением"):
if conv_id!.id as? String != nil {
NSString всегда является строкой; Я удивлен, что компилятор не предупреждает вас об этом. Таким образом, тест не имеет смысла.
Поэтому ваш код должен выглядеть следующим образом:
let conv_id = client_conversation.conversation_id
conv_id?.id = "hi"
Обратите внимание, что нет ложных отбрасываний и восклицательных знаков.
conv_id!
работает просто отлично, conv_id!.id
вызывает сбой. Охранники Мэллока не показывают никакого повреждения памяти, поэтому я немного озадачен тем, как это возможно.
id
является неявно развернутым необязательным необязательным значением, но это трудно определить без контекста (например, как определяется любая из этих вещей).