Осмысление retainCounts при использовании decodeObjectForKey: - PullRequest
0 голосов
/ 20 февраля 2012

У меня странная ситуация, и я надеюсь, что кто-то может пролить свет на это.Я реализую протокол NSCoding в пользовательском объекте и сталкиваюсь с утечками памяти в initWithCoder:.У меня есть что-то вроде этого:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
if(titleTemp) {
    [self setTitleString:titleTemp];
} else {
    [self setTitleString:[NSString string]];
}

У меня есть много других свойств этого объекта, некоторые из них массивы, некоторые строки и некоторые примитивы (double, int), и я постоянно получаю утечки памяти в этомметод.Инструменты говорят мне, что утечка происходит при каждом декодировании в строке decodeObjectForKey:.Когда вы пропускаете каждый отдельный декодированный объект внутри каждого пользовательского класса в массиве из 10+ объектов, память начинает складываться.

Но что меня действительно озадачило, так это вывод этого кода:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
NSLog(@"%i", titleTemp.retainCount);

- это "3"!

Вау, откуда все эти остатки?Бьет меняНо я хотел бы знать со всеми этими утечками.Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Вау, откуда все эти остатки?

Трудно сказать, если вы не видите код, который выполняет сохранение, но если это не ваш код, вам не нужно беспокоиться об этом. Вполне возможно, что -decodeObjectForKey: на самом деле вызывает несколько других методов для создания строки, и любой из них может сохранить и впоследствии автоматически освободить эту строку.

Бьет меня. Но я хотел бы знать со всеми этими утечками.

Вместо того, чтобы пытаться использовать -retainCount для поиска утечек, посмотрите на протекшие предметы. Инструменты могут помочь вам сделать это. Удостоверьтесь, что вы балансируете свои хранилища (и, конечно, выделяете, копируете и новые) и выпуски для этих объектов. Если вы чрезмерно удерживаете или недостаточно отпускаете объект, это приведет к утечке. Если какой-то код, находящийся вне вашего контроля, делает это, вы мало что можете с этим поделать.

2 голосов
/ 20 февраля 2012

Читать это: http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/. Он прав. Для вас это означает, что вам нужно следовать правилам управления памятью Cocoa, игнорируя значение, возвращаемое retainCount. Убедитесь, что вы release или autorelease имеете каждый принадлежащий вам объект, либо потому, что вы сохранили его, либо потому, что вы получили его из метода, начинающегося с init, new, copy или mutableCopy. Кроме того, ваши релизы / авто-релизы должны быть сбалансированы с вашими ссылками. Таким образом, если вы сохраняете объект один раз, вы можете освободить его только один раз.

В данном конкретном случае проблема, похоже, заключается не в небольших отрывках, которые вы опубликовали. Важным моментом является то, что вы не должны отлаживать с помощью retainCount.

...