Наиболее распространенная причина этой ошибки - когда вы освобождаете объект, и какой-то другой механизм пытается получить к нему доступ / освободить / освободить его позже.
Всякий раз, когда я получаю сообщение об ошибке EXC_BAD_ACCESS
, моя первая рекомендация - пройтись по коду, чтобы определить, какая строка вызывает его, а затем искать любые явные [object release]
вызовы, которые ссылаются на этот объект. Прокомментируйте их один за другим, чтобы выяснить, где вы могли ошибиться (и, конечно же, убедитесь, что объект правильно отпущен позже).
Если линия не помогает вам определить, какие объекты являются причиной проблемы, начните просматривать вызовы [object release]
и убедитесь, что вы не выпускаете объекты слишком много раз случайно, или освобождение объектов, которые вам не принадлежат.
Это приводит к хорошему общему руководству относительно release
в Objective-C:
Если вы владеете объектом (выделяете или сохраняете его), вы освобождаете его. Если вы не владеете им (пришли с помощью удобного метода или кто-то другой выделил его), вы не выпускаете его.
(Через Управление памятью с помощью Objective C / Cocoa / iPhone , в котором также есть несколько полезных советов.)