Почему я получаю утечку при использовании CFPropertyListCreateDeepCopy? - PullRequest
1 голос
/ 13 октября 2010

Я создаю глубокую изменчивую копию словаря, но по какой-то причине я получаю утечку.Я пробовал это:

NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, sectionedDictionaryByFirstLetter, kCFPropertyListMutableContainers);
self.copyOfSectionedDictionaryByFirstLetter = mutableCopy;
CFRelease(mutableCopy);

И это:

copyOfSectionedDictionaryByFirstLetter = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, sectionedDictionaryByFirstLetter, kCFPropertyListMutableContainers);

Оба помечены устройством утечки интерфейса разработчика.

Есть идеи?

Спасибо!

Ответы [ 4 ]

1 голос
/ 22 октября 2010

Полагаю, вы сохраняете один из объектов в словаре. Каково количество пропущенных байтов?

0 голосов
/ 24 октября 2010

Если вы вызываете часть ниже несколько раз:

NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, sectionedDictionaryByFirstLetter, kCFPropertyListMutableContainers);
self.copyOfSectionedDictionaryByFirstLetter = mutableCopy;
CFRelease(mutableCopy);

Вы должны изменить его на:

NSMutableDictionary *mutableCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, sectionedDictionaryByFirstLetter, kCFPropertyListMutableContainers);
[self.copyOfSectionedDictionaryByFirstLetter release];
self.copyOfSectionedDictionaryByFirstLetter = mutableCopy;
CFRelease(mutableCopy);

Полагаю, это может быть вашей причиной утечки.

0 голосов
/ 23 октября 2010

Я подозреваю, что непосредственный случай с NSMutableDictionary сбивает с толку профилировщика. Попробуйте следующее:

CFMutableDictionaryRef mutableCopy = CFPropertyListCreateDeepCopy(kCFAllocatorDefault, sectionedDictionaryByFirstLetter, kCFPropertyListMutableContainers);
if (mutableCopy) {
    // NOTE: you MUST check that CFPropertyListCreateDeepCopy() did not return NULL.
    // It can return NULL at any time, and then passing that NULL to CFRelease() will crash your app.
    self.copyOfSectionedDictionaryByFirstLetter = (NSMutableDictionary *)mutableCopy;
    CFRelease(mutableCopy);
}
0 голосов
/ 14 октября 2010

Вы действительно выпускаете copyOfSectionedDictionaryByFirstLetter в вашем dealloc методе?

Вам также нужно будет сделать:

self.copyOfSectionedDictionaryByFirstLetter = nil;

Или:

[copyOfSectionedDictionaryByFirstLetter release];
copyOfSectionedDictionaryByFirstLetter = nil; // Just for good style
...