2015-09-11 7 views
1

Я искал краш журналы моего приложения, и я видел это (что произошло тихие несколько раз, а не только один или два раза):Почему iOS отправляет предупреждение памяти на освобожденные объекты, что приводит к сбою моего приложения?

enter image description here

Как показано выше, центр уведомлений размещена память предупреждающее уведомление, и оно каким-то образом перенаправлено на CALayer. Я также видел экземпляры сообщений didReceiveMemoryWarning:, отправленных другим освобожденным объектам, таким как UIImageView или даже приватным _UINavigationBarBackground объектам, когда на моем отладчике также были отключены зомби, также сбой моего приложения. Почему это произойдет?

+0

У меня такая же проблема с базовым основанием, и я узнал о том, что мы должны вручную выпускать объекты CF в ARC, поэтому я не знаю о вашей проблеме, но могу сказать, что ARC автоматически не выпускает CF-память, но не подтверждает, что ваш Поражение в CALayer надеется, что это поможет вам. –

+0

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

ответ

1

NSNotificationCenter сохраняет только слабый ссылки на наблюдателей.

Что, вероятно, происходит из-за того, что у вас есть еще один объект, который регистрируется для UIApplicationDidReceiveMemoryWarningNotification, но который никогда не отменяет регистрацию (это ошибка). Поскольку NSNotificationCenter поддерживает только слабые ссылки на те объекты, которые он не замечает, когда они деллакод и их память повторно используется для других объектов, таких как CALayer и т. Д., Которые не реализуют метод с именем didReceiveMemoryWarning.

+0

Один из моих пользовательских классов регистрировался для этого самого уведомления, но никогда не регистрировался. Я не зарегистрировал их на dealloc, и проблема решена. –

1

Это похоже на проблему с управлением памятью. Как правило, предупреждение о памяти будет отправлено на существующий в настоящее время UIViewController, который живет в каком-то гипотетическом месте X в памяти.

Но во время выполнения, вместо того, чтобы найти свой UIViewController на месте X, как и ожидалось, он нашел какой-то другой объект, как случайный CALayer или UIImageView, который не знает, как реагировать на didReceiveMemoryWarning:. Это приводит к сбою, который вы видите.

Использует ли ваш проект ARC? Включите его, если его еще нет, что должно уменьшить частоту этих ошибок. Если вы используете ручное сохранение/освобождение, вероятно, в вашей реализации есть некоторая ошибка.

Если у вас есть код, который делает забавные вещи с памятью или любой код, который делает взломанные вещи с переходом на контроллер контроллера, это могут быть преступники, я бы опубликовал этот код.

Также попробуйте вручную отправить предупреждение о сохранении памяти в свое приложение, как только оно будет запущено, чтобы узнать, проявляется ли проблема немедленно, или если приложение должно запускаться некоторое время до его возникновения.