Правильная обработка асинхронного NSObject - PullRequest
1 голос
/ 08 июля 2010

У меня есть ситуация, подобная этой: Objective-C: как правильно использовать управление памятью для асинхронных методов

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

Мои 2 вопроса:

Когда я освобождаю объект извлечения данных? Ссылка, которую я разместил выше, дает 2 ответа, один говорит, что освобождает делегата, и другой говорит, что освобождение немедленно, что является правильным (или что лучше, если оба ответа правильны)

Мой второй вопрос: как лучше всего передать полученные данные вызывающей стороне? На данный момент у меня есть

self.imagesDataSource = [articleImagesParserObject.returnedArray copy];

Я использовал copy, потому что, насколько я понимаю, это делает изменяемый массив неизменным. Это правильно?

1 Ответ

0 голосов
/ 09 июля 2010

Я собираюсь поднять вас на пару вещей .. Это может начать катиться мяч:)

Вы говорите

Затем он имеет метод делегата, который передает полученные данные в абонент

- РЕДАКТИРОВАТЬ -
Вы имеете в виду, что отправляете сообщение делегату NSURLConnection. Да, это просто семантика, но она понятнее.

Вы говорите

Ссылка, которую я разместил выше, дает 2 ответы, один говорит, что релиз в делегат и один говорит релиз немедленно

В сообщении, на которое вы ссылаетесь, говорится, что если вы запустите вторичный поток с NSThread +detachNewThreadSelector:toTarget:withObject:, то поток сохранит ваш объект, поэтому, если вы закончили с ним, вы можете освободить его, как обычно. Вы этого не делаете.

Второй предложенный метод - предоставить метод для обратного вызова, когда ваша фоновая операция завершена. Поскольку вы используете NSURLConnection, и он уже предоставляет вам перехваты обратного вызова, и фактически вы используете их для возврата загруженных данных, это похоже на путь.

Копирование изменяемого массива действительно дает вам неизменяемую копию, которой вы владеете - поэтому она должна быть self.imagesDataSource = [[articleImagesParserObject.returnedArray copy] autorelease], если только imagesDataSource не сохраняет - что было бы нерегулярно.

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