Как я могу узнать, был ли освобожден объект, на который есть ссылка, в target-c? - PullRequest
1 голос
/ 30 июня 2010

После обновления до iPhone OS 4.0 приложение начало сбой после переключения между приложениями. Приложение падает в том же месте, когда приложение получает предупреждение о памяти.

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

Можно ли проверить, был ли объект освобожден, чтобы мы могли перераспределить его?

Ответы [ 3 ]

6 голосов
/ 30 июня 2010

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

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

Вам необходимо убедиться, что вы правильно сохранили все нужные вам объекты, чтобы они не были выпущены ненадлежащим образом. Сохраненный объект не освобождается даже в ситуациях нехватки памяти.

Редактировать

Я бы добавил, что наиболее распространенной причиной сбоев в нехватке памяти является предположение, что представление или ресурс в представлении всегда присутствует, даже если представление не отображается. Система удалит не отображаемые представления и их ресурсы (например, изображения) в памяти с низким объемом памяти. Проверьте didReceiveMemoryWarning контроллеров представления.

4 голосов
/ 18 февраля 2014

Вы можете добавить

-(void)dealloc { ... }

И оставить его пустым, если это правильно, и добавить в него точку останова.

Этот ответ правильный для ARC и NON-ARC

2 голосов
/ 23 января 2017
  1. Реализуйте метод dealloc внутри UIViewController, чтобы увидеть момент, когда он освобождается из памяти

    - (void) dealloc

  2. Печатьссылка на любой объект, который вы хотите проверить.

    NSLog("Get pointer: %@", self); // ViewController

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

`po [pointer_printed_before]

enter image description here

Здесь вы можете видеть, что указатель больше не доступен, после того как метод dealloc напечатал журнал, объекта больше нет.

...