Почему Obj-C GC очищает мою ссылку? - PullRequest
0 голосов
/ 29 января 2009

Я пишу программу Objective-C, которая использует сборщик мусора.

Я получаю EXC_BAD_ACCESS в некоторых ситуациях, классический пример того, как объект "слишком освобожден". Используя некоторые советы по отладке в этом техническом замечании , а именно MallocScribble и AUTO_LOG_COLLECTIONS , я могу видеть, что мой объект выводится из-под меня.

С учетом сказанного, вот мой код.

У меня есть NSMutableDictionary, который содержит ONLY ссылку на объект. В методе я тогда делаю:

NSObject *object = [dictionary objectForKey:key];

NSLog(@"Object is %@", object);
[dictionary removeObjectForKey:key];

Если я удаляю объект из словаря до оператора NSLog, если GC запускается в нужный момент, я получаю EXC_BAD_ACCESS . Удаление из словаря после никогда не завершается неудачей.

Почему это?

Ответы [ 2 ]

1 голос
/ 29 января 2009

Вы убедились, что сборка мусора действительно включена? Вы можете попробовать добавить метод -dealloc в свой класс и посмотреть, попадете ли вы в него. Это никогда не ударит с включенным GC. Согласно документации Apple, сборщик мусора не должен собирать объекты, на которые указывают переменные стека, поэтому то, что вы видите, не должно происходить.

1 голос
/ 29 января 2009

Раздел Руководство по программированию сборки мусора *1002*, посвященный внутренним указателям, кажется наиболее близким документом для этого явления, но, похоже, не совсем подходит. Попробуйте убедиться, что ваше приложение на самом деле использует сборку мусора вместо ручного подсчета ссылок. Если сборщик мусора действительно включен, то может показаться, что он либо содержит ошибку, либо недостаточно документированную функцию.

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