Свифт EXC_BAD_ACCESS с поврежденным объектом?

-1

По какой-то странной причине я сталкиваюсь с 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"
)

Кажется, я не могу напрямую получить доступ к строке.

  • 0
    Наиболее вероятной причиной может быть то, что id является неявно развернутым необязательным необязательным значением, но это трудно определить без контекста (например, как определяется любая из этих вещей).
  • 0
    Какой тип client_conversation? Возможно ли, что параметр message_id был освобожден, и вы пытаетесь использовать экземпляр, который больше не существует?
Показать ещё 5 комментариев
Теги:
memory-corruption
exc-bad-access

1 ответ

2

Каждый раз, когда вы говорите ! вы приглашаете крах. Перепишите свой код так, чтобы ! никогда не появляется. Знайте свои Опционы и разворачивайте каждый из них безопасно. Узнайте, как сравнить опцию с nil перед распаковкой или как использовать конструкцию if let.

Кроме того, обратите внимание, что эта строка - полная глупость (то, что я называю "ложным приведением"):

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

NSString всегда является строкой; Я удивлен, что компилятор не предупреждает вас об этом. Таким образом, тест не имеет смысла.

Поэтому ваш код должен выглядеть следующим образом:

let conv_id = client_conversation.conversation_id
conv_id?.id = "hi"

Обратите внимание, что нет ложных отбрасываний и восклицательных знаков.

  • 0
    Привет, Мэтт, спасибо за отзыв, но проблема в том, пока conv_id! работает просто отлично, conv_id!.id вызывает сбой. Охранники Мэллока не показывают никакого повреждения памяти, поэтому я немного озадачен тем, как это возможно.
  • 0
    Позвольте мне спросить вас: что, если вы перестанете использовать NSString везде? Знаете, вы все равно используете неправильно. Просто сделайте id строкой.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню