Как освободить несколько классов, имеющих одинаковый делегат? - PullRequest
1 голос
/ 28 ноября 2010

(или даже только один класс с одним делегатом)

Скажем, у меня есть класс DataGetter, который загружает файл из Интернета.У него есть метод делегата, который запускается при загрузке файла:

- (void) dataGetterFinished:(DataGetter *)dataGetter;

Так что где-то в моем коде я могу настроить несколько файлов для загрузки следующим образом:

// in AViewController.m
DataGetter *blueFile = [[DataGetter alloc] init];
blueFile.delegate = self;
[blueFile getData:@"http://example.com/blue-file"];

DataGetter *redFile = [[DataGetter alloc] init];
redFile.delegate = self;
[redFile getData:@"http://example.com/red-file"];

Используя статический анализатор clang, каждая выделенная строка выше выдает ошибку «потенциальная утечка объекта, размещенного в строке…».Итак, как бы я выпустил объект.Он должен торчать, потому что у него есть делегат.Так можно ли выпускать его в качестве последней строки метода dataGetterFinished, например,

- (void) dataGetterFinished:(DataGetter *)dataGetter
{
// code
[dateGetter release];
}

... или я должен каким-либо образом использовать autorelease?

1 Ответ

1 голос
/ 28 ноября 2010

Технически это работает нормально, однако я бы предложил отслеживать разные DataGetters в NSMutableArray.

Например:

DataGetter *blueFile = [[DataGetter alloc] init];
blueFile.delegate = self;
[blueFile getData:@"http://example.com/blue-file"];
[dataGetters addObject:blueFile]; // dataGetters is an NSMutableArray declared in the .h
[blueFile release];

// Same for red

Затем в методе делегата просто удалитьgetter from the array:

- (void) dataGetterFinished:(DataGetter *)dataGetter
{
// code
[dataGetters removeObject:dataGetter];
}

Массив заботится о сохранении объекта, и вы не получите предупреждение анализа.

Просто убедитесь, что dataGetters выпущен в методе dealloc.

...