сборы на appdelegate растоптать - PullRequest
0 голосов
/ 29 ноября 2009

Я 15-летний ветеран C ++ и думал, что могу легко справиться с проблемами памяти на iPhone. Но я был смирен этим новым окружением в несколько поворотов. Здесь моя проблема. Я надеюсь, что задаю вопрос правильно.

По сути, я храню изменяемый массив моего общего объекта в приложении appdelegate. Это кажется разумным местом для сохранения коллекции объектов, которые используются несколькими различными представлениями. Однако между моментом, когда я создаю представление и отправляю его на контроллер Nav, и временем, когда представление начинает использовать эти значения, место в памяти, где я создавал мои объекты, теряет свои значения.

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

Мой вопрос такой ... Происходит ли что-то такое, о чем мне нужно знать, когда я «выдвигаю» представление, которое может привести к потере памяти? У меня есть кнопка, которую пользователь нажимает, чтобы выделить-инициализировать viewcontroller, а затем выполнить «pushViewController» для содержащего контроллера nav. В следующей строке я проверяю, что мои объекты были созданы, и отслеживаю память. К сожалению, память перестает работать, когда событие кнопки переходит в «PurpleEventCallback».

Имеет ли это какой-либо смысл для кого-либо? Что-то происходит с моим взглядом, который обычно не известен, что заставляет мою память стать недействительной?

Ответы [ 2 ]

1 голос
/ 29 ноября 2009

Добро пожаловать на ТАК! Похоже, вы все делаете правильно. Просто чтобы быть уверенным, что retain / release не вызывает проблем, попробуйте снова сохранить структуру массива, прежде чем нажимать контроллер представления. Помните, что некоторые конструкторы возвращают объекты с счетом сохранения 1, а другие возвращают автоматически освобожденные объекты с счетом хранения ноль. Как правило, все функции, начинающиеся с «new», «create» или «alloc», возвращают объекты со счетом +1. Другие вспомогательные функции, такие как [NSMutableArray arrayWithCapacity:] и [NSString stringWithFormat:], возвращают объекты, которые были автоматически освобождены и имеют счет нулевого сохранения. Если вы сохраните указатель на эти объекты, они будут случайным образом исчезать при очистке цикла выполнения.

Вы также можете посмотреть на отладку, используя технику "зомби". Это очень полезно, когда вы начинаете случайным образом получать EXE_BAD_ACCESS ошибок. Проверьте эту страницу для получения дополнительной информации: http://www.cocoadev.com/index.pl?NSZombieEnabled

Из этой статьи: «... при включенных зомби сообщения на освобожденные объекты больше не будут вести себя странно или не будут работать сложными для понимания способами, а вместо этого будут регистрировать сообщение и умирать предсказуемым и отлаживаемым способом с остановом на остановку . Это инструмент, который нужно использовать при попытке отследить перевыпуск и преждевременные выпуски. "

Надеюсь, это поможет!

0 голосов
/ 29 ноября 2009

Возможно, вы раньше не читали о концепции пулов с автоматическим выпуском в Какао. Автоматическое освобождение объекта откладывает освобождение объекта до конца текущего цикла событий (или всякий раз, когда пул авто-релиза сливается).

Чтобы проверить, является ли проблема с автоматическим выпуском, установите переменную окружения NSEnableAutoreleasePool на "NO". Если проблема исчезнет, ​​проблема с авто-выпуском.

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