Когда выпустить.Инструменты говорит, что у меня есть утечка - PullRequest
0 голосов
/ 05 октября 2010

Иногда мне интересно, где бы я мог получить отличную информацию, кроме как от сообщества переполнения стека. Я полагаю, что руководство по управлению памятью Objective-C не будет плохим, но я чувствую, что вы, ребята, можете сказать мне почему , а не просто что делать.

У меня есть следующий код:

NSString* rawTickerData = [[NSString alloc] initWithData: op.requestData encoding:NSUTF8StringEncoding];
NSArray* lines   = [rawTickerData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

for(NSString* line in lines)
{
    NSArray* fields = [line componentsSeparatedByString:@","];

    if([fields count] > 1)
    {
        [self.tickerData addObject:fields];
    }
}
    [rawTickerData release]

Instruments сообщает мне, что fields протекает, но попытка освободить его после оператора if или выполнение автоматического выпуска дает EXC_BAD_ACCESS.

То же самое происходит с lines. Выпуск его в любом месте или попытка сделать авто-релиз дает EXC_BAD_ACCESS или "попытка освободить двойную версию" (для авто-релиза).

Тем не менее, инструменты все еще говорят, что они протекают. Я что-то упустил?

Ответы [ 2 ]

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

Если я что-то упустил, код, который вы разместили, верен.fields - объект с автоматическим освобождением, который сохраняется при добавлении к self.tickerData.lines также автоматически высвобождается, поэтому он не протекает (по крайней мере, не в показанном коде).

Если вы пропускаете что-либо, это потому, что вы неправильно очищаете self.tickerData.Если вы закомментируете строку [self.tickerData addObject:fields];, вы все еще получаете сообщения об утечках?Если нет, убедитесь, что вы вызываете [tickerData release] (или что-то подобное, например, self.tickerData = nil), возможно, в вашей реализации dealloc.

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

В этих случаях лучше всего освобождать объекты в конце каждого цикла, если вы их сохранили.В этом случае ваша переменная fields получает объект autorelease, лучше всего использовать NSAutoReleasePool для освобождения ваших объектов в конце цикла.

NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];

NSString* rawTickerData = [[NSString alloc] initWithData: op.requestData encoding:NSUTF8StringEncoding];
NSArray* lines   = [rawTickerData componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

for(NSString* line in lines)
{
    NSArray* fields = [line componentsSeparatedByString:@","];

    if([fields count] > 1)
    {
        [self.tickerData addObject:fields];
    }
    [pool drain];
}
[rawTickerData release];

Это сбросит всеавтоматически выпущенные объекты, если они не нужны.Если вы не используете пул автоматического выпуска, ваши объекты будут жить до тех пор, пока ваш метод не завершится.Если это не решит проблему утечки, я предлагаю инициализировать ваш массив следующим образом:

NSArray *lines = [[NSArray alloc]initWithArray:[line componentsSeparatedByString:@","]];
//and release at the end of the loop
[lines release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...