как мне правильно выпустить этот NSString? - PullRequest
2 голосов
/ 16 декабря 2011

Код:

- (void) foo : (NSString*) ori_string
{
    her_string = [ori_string copy];

    while ([her_string length]>0) 
    {
        her_string = [her_string substringFromIndex:1];
        //do something...
    }

    [her_string release];  //Here is the problem
}

Привет всем,

если я выпущу her_string, как указано выше, Анализатор сказал, что it's an incorrect decrement of the reference count of an object that is not owned at this point by the caller.

В противном случае, если я не отпущу его, он сказал, что это потенциальная утечка памяти.

Где и как мне его выпустить? Спасибо!

Ответы [ 2 ]

10 голосов
/ 16 декабря 2011

Удалите строку [her_string release] и добавьте autorelease к copy.

- (void) foo : (NSString*) ori_string
{
    her_string = [[ori_string copy] autorelease];

    while ([her_string length]>0) 
    {
        her_string = [her_string substringFromIndex:1];
        //do something...
    }
}

. Проблема в том, что copy возвращает строку, которая должна быть освобождена, и вы теряетесослаться на него, переписав строку с помощью substringFromIndex вызовов.После потери ссылки она никогда не может быть должным образом освобождена, и поэтому первая скопированная версия строки утечет (если length > 0, в противном случае ваш код правильно освобождает строку).

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

0 голосов
/ 16 декабря 2011

вам не нужно освобождать NSString, возвращенную [NSString copy] вы освобождаете только тот объект, который создан [[XXXX alloc] init]

IOS 5 использует ARC, вам не нужно беспокоиться о том, когда выпустить или сохранить, если вы работаете с ARC

...