Основные данные / NSArray Вызывает утечки? - PullRequest
1 голос
/ 01 марта 2010

У меня есть конкретная утечка, которую я не могу понять до конца, потому что мой поиск всегда заканчивается в некоторых библиотеках Apple. Любая помощь от некоторых ветеранов в решении этой проблемы будет принята.

Вот соответствующий исходный код: (утечка указана с комментарием)

- (void)viewDidLoad {
//[super viewDidLoad];

NSManagedObjectContext *context = [(iEatAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext];

addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:creator action:@selector(launchCreatorWindow)];
self.navigationItem.rightBarButtonItem = addButton;

NSFetchRequest *fetReq = [[NSFetchRequest alloc] init];
[fetReq setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:context]];
NSError *e = nil;

NSArray *temp = [context executeFetchRequest:fetReq error:&e];  
//leaking here according to performance tool

self.tableObjects = [[NSMutableArray alloc] initWithArray:temp];

if (e) {
    NSLog(@"%@, %@", e, [e description]);
}
[fetReq release];
}

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

Инструмент повышения производительности сообщает, что это категория: CFArray (store-deque) Событие: Malloc также говорит, что моя библиотека несет ответственность. Это трассировка стека, номер 8 - мой кадр viewDidLoad:

0 CoreFoundation __CFAllocatorSystemAllocate
1 CoreFoundation CFAllocatorAllocate
2 CoreFoundation _CFAllocatorAllocateGC
3 CoreFoundation _CFArrayReplaceValues
4 CoreFoundation CFArrayReplaceValues
5 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:]
6 CoreFoundation -[NSArray initWithArray:copyItems:]
7 CoreFoundation -[NSArray initWithArray:]

Этот действительно застрял, любая помощь очень ценится.

Ответы [ 3 ]

1 голос
/ 01 марта 2010

Это вызывает вашу утечку:

self.tableObjects = [[NSMutableArray alloc] initWithArray:temp];

Вы создаете массив с счетом сохранения 1, затем используете self.tableObjects, который (если это свойство помечено как сохранение) увеличивает счет до 2.

Затем в dealloc при освобождении массива счетчик возвращается к 1, а не к 0, поэтому массив никогда не освобождается.

Вместо этого просто сделайте это:

 self.tableObjects = [NSMutableArray arrayWithArray:temp];

Возвращает автоматически освобожденный массив, поэтому возможное количество сохранений будет только 1.

0 голосов
/ 01 марта 2010

Это не причина вашей утечки, но я подумал, что в любом случае стоило бы указать: вы должны отпустить кнопку addbutton сразу после того, как она назначена для rightBarButtonItem, поскольку она больше не понадобится / не будет использоваться снова:

self.navigationItem.rightBarButtonItem = addButton;
[addButton release];
0 голосов
/ 01 марта 2010

Ответ: мне не хватает чего-то простого. [NSMutableArray alloc] сохранить количество = 1 self.tableObjects = сохранить счет = 2 dealloc сохранить количество еще не 0 течь.

К сожалению об этом

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