Objective-C о проблеме выпуска iPhone - PullRequest
0 голосов
/ 29 апреля 2009

У меня проблема с тем, что я получаю EX_BAD_ACCESS при вызове release для объекта NSStream в моем dealloc на iPhone.

следующий код

- (void)dealloc {
    DLog(@"dealloc started for: %@",self);
    @synchronized(self) {
        lookupCount--;
    if (lookupCount==0) {
        UIApplication* app = [UIApplication sharedApplication];
        app.networkActivityIndicatorVisible = NO;
        }
    }
    DLog(@"inStream retain count before release: %d",[inStream retainCount]);
    [inStream release];
    DLog(@"outStream retain count before release: %d",[outStream retainCount]);
    [outStream release];
    [queryToSend release];
    [resultString release];
    [data release];
    [super dealloc];
    NSLog(@"dealloc finsihed for : %@",self);
    }

падает с EX_BAD_ACCESS на [опередить релиз]; линия.

Вывод журнала выглядит следующим образом

2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 160] dealloc started for: <SimpleQuery: 0x56e540>
2009-04-29 13:16:28.547 App[30580:20b] -[SimpleQuery dealloc] [Line 168] inStream retain count before release: 1
2009-04-29 13:16:28.548 App[30580:20b] -[SimpleQuery dealloc] [Line 170] outStream retain count before release: 1

Хотите знать, есть ли у кого-нибудь идеи, почему это может быть?

Ответы [ 2 ]

1 голос
/ 29 апреля 2009

В комментарии вы сказали это о outstream

Он создан вызовом getStreamsToHostNamed: порт: InputStream: OutputStream: который не должен возвращать автоматически выпущенный объекты, которые я не думаю.

На самом деле, автоматически выпущен. Если вы не храните этот объект где-то в своем коде, вы не несете ответственности за управление им в памяти.

Обратите внимание на Руководство по управлению памятью Apple .

Многие классы предоставляют методы form + className ... что вы можете использовать для получить новый экземпляр класса. Часто упоминается как «удобство конструкторы », эти методы создают новый экземпляр класса, инициализация и вернуть его для использования. Хотя вы можете думать, что вы ответственность за освобождение объектов создан таким образом, это не случай согласно политике какао set - имя метода не содержит «alloc» или «copy», или начинаются с «Новый». Потому что класс создает новый объект, он отвечает за распоряжение новым объектом.

0 голосов
/ 29 апреля 2009

Некоторые потенциальные проблемы:

  • Вы блокируете себя, чтобы выполнить цикл декремента lookupCount, который, как я предполагаю, означает, что вы ожидаете, что этот код будет выполняться из разных потоков. Это должен быть красный флаг прямо здесь, так как если вы освобождаете экземпляр из двух потоков одновременно, один из этих потоков в конечном итоге попытается освободить уже освобожденный экземпляр.
  • Последний вызов NSLog попытается напечатать self, который уже был бы освобожден.

Я знаю, что ничего из этого не относится конкретно к [outStream release], но они могут быть связаны. Возможно, вы захотите попробовать отладить это с помощью NSZombieEnabled , чтобы получить больше информации.

Кроме того, убедитесь, что при выпуске inStream также неявно не освобождается outStream и т. Д.

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