Как избежать захвата себя в блоках при реализации API?

У меня есть работающее приложение, и я работаю над его преобразованием в ARC в Xcode 4.2. Одно из предупреждений предварительной проверки включает захват self строго в блоке, ведущем к циклу сохранения. Я сделал простой пример кода, чтобы проиллюстрировать проблему. Я считаю, что понимаю, что это означает, но не уверен, какой «правильный» или рекомендуемый способ реализовать такой сценарий.

  • self является экземпляром класса MyAPI
  • код ниже упрощен, чтобы показать только взаимодействия с объектами и блоками, относящимися к моему вопросу
  • предполагают, что MyAPI получает данные из удаленного источника, а MyDataProcessor работает с этими данными и выдает вывод
  • процессор настроен с блоками для передачи информации о прогрессе и состоянии

пример кода:

// code sample
self.delegate = aDelegate;

self.dataProcessor = [[MyDataProcessor alloc] init];

self.dataProcessor.progress = ^(CGFloat percentComplete) {
    [self.delegate myAPI:self isProcessingWithProgress:percentComplete];
};

self.dataProcessor.completion = ^{
    [self.delegate myAPIDidFinish:self];
    self.dataProcessor = nil;
};

// start the processor - processing happens asynchronously and the processor is released in the completion block
[self.dataProcessor startProcessing];

Вопрос: что я делаю «не так» и / или как это следует изменить, чтобы соответствовать соглашениям ARC?

222
задан XJones 25 October 2011 в 18:16
поделиться