Таинственная потеря памяти для глобальной вар? - PullRequest
0 голосов
/ 26 февраля 2011

В моем коде я создаю глобальную переменную (без аналога в файле .h) с именем Events.Это NSMutableArray.К нему обращается только тот класс, в котором он определен.

Когда вызывается «viewDidLoad», мой код делает несколько вещей: во-первых, он инициализирует события.Затем он создает 7 NSMutableArrays и добавляет их в объект Events.

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

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

Я провел массу отладки, пытаясь выяснить, что идет не так, и я сузил это до следующего:

Через некоторое время после того, как мой код закончен, события полностью сбрасываются.Я отследил его до конца моей функции, и на этом конце он все еще имел все семь NSMutableArrays.

Как только он достиг конца моей функции, я нажал кнопку продолжения и установил точку останова непосредственно передместо, где сгенерированные кнопки снова получают доступ к событиям var.В этом месте события полностью пусты.

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

Может кто-нибудь сказать, как остановить выгрузку событий?Спасибо:)

Ответы [ 2 ]

3 голосов
/ 26 февраля 2011

Похоже, вы делаете что-то вроде Events = [NSMutableArray array];.Это создает автоматически выпущенный экземпляр NSMutableArray, который будет автоматически удален через некоторое время после возврата вашей функции.

Вместо этого вы можете захотеть сделать Events = [[NSMutableArray alloc] init];, чтобы создать экземпляр, который не был автоматически выпущен, или Events = [[NSMutableArray array] retain]; длясохранить автоматически выпущенный экземпляр.В любом случае система будет знать, что вы все еще используете объект, и поэтому не будете им распоряжаться.

1 голос
/ 26 февраля 2011

Вы не опубликовали свой код, но я предполагаю, что вы просто распределили массив через [NSMutableArray array], не так ли? Ну, массив автоматически освобождается через некоторое время после того, как поток покидает метод, в котором вы создали массив. Чтобы предотвратить это, вам просто нужно retain массив.

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