2011-01-20 2 views
2

Привет У меня есть следующий кодотпуская 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]; 

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

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

Я высказал мнение, что NSOperationQueue принимает уход за удерживающими предметами. есть ли что-то, что я делаю неправильно или не знаю.

+2

Он сохранит вашу операцию, поэтому у вас возникнут другие проблемы. Что вы делаете с объектом при его завершении? Что-нибудь? –

+0

да, вы правы, вероятно, есть проблема else where .... –

ответ

3

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

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

+0

re: «Строка, которая' constructXMLMessage: 'возвращает будет продолжаться до тех пор, пока текущий пул автозаполнения, который должен быть все время, когда вам нужно работать с ним »- вы имеете в виду, что он прослужит достаточно долго, чтобы перейти к NSInvocationOperation, который сохранит его, верно? Несмотря на то, что операция будет использовать сохраненную версию, пул авторезистов (текущего), возможно, исчезнет к моменту запуска операции. – Richard

+0

Хорошая точка; Я пропустил это. Да, в документах для NSInvocationOperation указано, что назначенный инициализатор указывает вызову сохранить свои аргументы, поэтому строка должна быть безопасной даже после того, как пул истощится, пока операция не завершится. –

Смежные вопросы