iPhone — утечки памяти в NSSortDescriptor

Я получаю утечки памяти, используя следующий код:

Интерфейс:

@property (nonatomic, retain) NSArray *sortedItems;

Реализация:

NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"ScannedDate" ascending:NO] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedArray = [self.items sortedArrayUsingDescriptors:sortDescriptors];
self.sortedItems = [NSArray arrayWithArray:sortedArray]; // memory leak 100% here

- (void)viewDidUnload {
  self.sortedItems = nil;
  [super viewDidUnload];
}

- (void)dealloc {
  [sortedItems release];
  [super dealloc];
}

person fulvio    schedule 27.02.2011    source источник
comment
как определяется свойство sortedItems? если у него есть свойство сохранения - вы освобождаете его в методе Dealloc?   -  person Vladimir    schedule 27.02.2011
comment
Как определяется ваше свойство sortedItems?   -  person Nick Weaver    schedule 27.02.2011
comment
См. обновленный код для Dealloc и определения sortedItems.   -  person fulvio    schedule 27.02.2011
comment
Какова цель строки arrayWithArray?   -  person makdad    schedule 27.02.2011
comment
Что-то, что полностью компилируется, поможет - я думаю, вы теряете self.items, так как я не вижу релиза о self.items   -  person Jens    schedule 27.02.2011


Ответы (1)


Ну, вы создаете два ненужных массива.

Замените это:

NSArray *sortedArray = [self.items sortedArrayUsingDescriptors:sortDescriptors];
self.sortedItems = [NSArray arrayWithArray:sortedArray]; // memory leak 100% here

... с этим:

self.sortedItems = [self.items sortedArrayUsingDescriptors:sortDescriptors];

Каждый раз, когда вы создаете массив, вы отправляете retain объектам, содержащимся в массиве. Если массив автоматически освобождается (что создают удобные методы выше), то точка, в которой отправляются их release сообщения, не контролируется программистом. Это может привести к очевидным утечкам в зависимости от обстоятельств во время выполнения.

person TechZen    schedule 27.02.2011