Сегодня у меня была довольно интересная авария exc_bad_access. После многократного копания я придумал следующую информацию (работает в симуляторе):Как NSLogs может привести к сбою кода?
Если я только что запустил код, приложение случайно разбилось бы в случайной точке при загрузке данных в мой управляемый объект. Из того, что я мог сказать, он всегда терпел крах, когда я загружал данные в управляемый объект, а не в разделы, которые преобразовывались из моего JSON-dict в данные к фактически используемому объекту (из строк и NSNulls в ints/float и nils)
Случайные сбои, конечно, злые, поэтому я попытался пройти процесс в отладчике, но это оказалось нецелесообразным - я обрабатывал много объектов, поэтому каждый шаг через них просто не работал. Поэтому я решил добавить некоторые NSLogs для отслеживания процесса и попытаться найти шаблон таким образом.
Мгновенно разрешили сбой.
Только один NSLog в любом месте этого процесса предотвратил сбой.
В конечном итоге я отслеживал путь к трассировке стека и обнаружил актуальную проблему: я обращался к управляемому объекту в потоковой среде, но НЕ из-за связанного с ним метода выполненияBlockAndWait:. В этот момент крушение было невероятно очевидным для меня - я в шоке, у меня больше не было проблем. Я готов поспорить, что между наличием «небольшого» набора тестовых данных из 2-3 объектов и наличием отладочного кода там с NSLogs ошибка была довольно эффективно замаскирована ранее ... но вопрос остается:
Почему делает NSLog препятствовать тому, чтобы приложение разбилось? Как на самом деле фрагмент кода без побочных эффектов изменил выполнение остальной части приложения? Это не имеет никакого смысла!
Используете ли вы где-нибудь функциюSelector: метод и селектор, который возвращает не тип id в качестве параметра для него? Несколько раз NSLog может предотвратить ошибки, связанные с этими ошибками.В этом случае нужно использовать NSInvocation – BergP