выпуск NSInvocationOperation приводит к сбою приложения

Привет, у меня есть следующий код

NSString *analyticsStr = [[NSString alloc] initWithString:[self constructXMLMessage:TagObj]];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                        selector:@selector(sendAnalyticsString:)
                                                                          object:analyticsStr];
[operationQueue addOperation:operation];
[analyticsStr release];
//[operation release];

когда я раскомментирую [выпуск операции], мое приложение падает. И я получаю эту ошибку:

malloc: * ошибка для объекта 0x726ed50: освобождаемый указатель не был выделен * установить точку останова в malloc_error_break для отладки

Я считал, что NSOperationQueue заботится о сохранении объектов. что-то я делаю не так или не знаю.


person Asad Khan    schedule 20.01.2011    source источник
comment
Это сохранит вашу операцию, поэтому у вас есть другая проблема. Что вы делаете с объектом, когда он завершен? Что-нибудь?   -  person Jason Coco    schedule 20.01.2011
comment
да вы правы наверное проблема в другом где....   -  person Asad Khan    schedule 20.01.2011


Ответы (1)


Для отладки используйте шаблон Zombies от Instruments. На временной шкале появится флаг, когда вы отправляете объекту сообщение после того, как он должен был быть освобожден; вы можете нажать кнопку в этом флаге, чтобы начать расследование того, что неправомерно освободило объект.

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

person Peter Hosey    schedule 20.01.2011
comment
re: строка, которую возвращает constructXMLMessage:, будет длиться столько же, сколько текущий пул автовыпуска, который должен быть все время, которое вам нужно для работы с ним - вы имеете в виду, что он будет длиться достаточно долго, чтобы перейти к NSInvocationOperation, который затем сохранит это, верно? Несмотря на то, что операция будет использовать сохраненную версию, (текущий) пул автоматического освобождения может исчезнуть к моменту выполнения операции. - person Richard; 20.01.2011
comment
Хорошая точка зрения; Я пропустил это. Да, в документах для NSInvocationOperation говорится, что назначенный инициализатор указывает вызову сохранять свои аргументы, поэтому строка должна быть безопасной даже после слива пула, пока операция не завершится. - person Peter Hosey; 20.01.2011