2015-11-06 1 views
0

Недавно я получил некоторые очень странные аварии на HockeyApp:Crashreport указывает Кво связь между объектом и параметром, который никогда не был инициирован в коде

Application Specific Information: Нагрузочный приложение из-за неперехваченного исключением «NSInternalInconsistencyException», причина : «Экземпляр 0x13ef90530 класса FPPhoto был освобожден, а наблюдатели с ключевыми значениями все еще были зарегистрированы с ним. Актуальная информация наблюдение: NSKeyValueObservationInfo 0x13e9e8bb0 (NSKeyValueObservance 0x13ef36810: Наблюдатель: 0x13e5a95f0, Key путь: fractionCompleted, Опции: Новое: ДА, Старые: НЕТ, До: НЕТ> Контекст: 0x0, свойство: 0x13ef795d0)»

Я понимаю, в основе crashreport, и это очень хорошо может быть правда, как я наблюдатели Кво повсюду в моем приложении, также связан с объектами типа FPPhoto

странной вещью Интересно о является имя параметра: (Путь к ключу: fr actionCompleted) У нас есть параметр под названием fractionCompleted, но это совершенно другое место в приложении. Добавим KVO в fractionCompleted, чтобы отслеживать прогресс загрузки. fractionCompleted KVO прослушиватель, хотя никогда не добавляется ни к одному объекту вида FPPhoto в коде.

Я думаю, либо это отчет о сбое, который перепутал имена параметров/классов, либо может быть хуже, -> какое-то смешение памяти во время выполнения, чтобы KVO привязался к неправильному объекту?

Любые идеи, как это может произойти?

+1

Я бы пересмотрел ваш код; это скорее вероятность ошибки в коде, чем в отчетах об ошибках или в системе KVO. Просто говорю' – trojanfoe

ответ

1

Вы должны рассмотреть вопрос о добавлении двух символических точек останова на:

-[NSNotificationCenter addObserver:selector:name:object:] 

и

-[NSNotificationCenter addObserverForName:object:queue:usingBlock:] 

С условием:

(BOOL) [@ "fractionCompleted" isEqualToString: (id) $ r8]

и

(BOOL) [@ "fractionCompleted" isEqualToString: (идентификатор) $ RDX]

Затем установите действие в качестве команды отладчика:

po $ rdx

и

ро $ RCX

Если вы хотите знать, зачем менять регистры, то есть потому, что OS X следует System V ABI для регистра вызова конвенций. Аргументы метода идут в:

RDI, риши, RDX, RCX, R8, R9

В этом аргументе порядке. Поскольку сообщения Objective-C компилируются в objc_msgsend(receiver, selectorname, argument1, argument2, argument3, argument4)

Мы должны изменить регистры сравниваемых, поскольку эти 2 -addObserver подписи отличаются в расположении своих аргументов для имени уведомления и observer объекта.

Использование этой точки останова поможет вам определить, какие объекты регистрируются в качестве наблюдателя, поэтому вы можете убедиться, что они освобождены & правильно удалить наблюдение.

EDIT: Только что понял, что вы не используете NSNotificationCenter, просто KVO. Но я не хочу удалять свой ответ, поэтому я просто оставлю его. Он по-прежнему применим, вам просто нужно изменить символ, который вы разрываете на - addObserver:forKeyPath:options:context:, и вам нужно будет добавить дополнительные условия, потому что иначе вы ударите эту точку останова 10 раз в секунду.

Смежные вопросы