Получение утечки после выполнения двух раз одного и того же действия - PullRequest
1 голос
/ 27 декабря 2010

У меня есть plist, и я получаю его информацию в nsmutabledictionary. Когда я вызываю этот метод в первый раз, все в порядке. Но когда я делаю то же самое во второй раз, в третий раз и так далее ... я получаю утечку. Код:

+(NSMutableDictionary *)obtainPlist{    
    if ([[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) {
        return [NSMutableDictionary dictionaryWithContentsOfFile:[self dataFilePath]];
    }
    else {
        return nil;
    }
}

и я вызываю этот метод из другого класса:

NSMutableDictionary *credenciales=[[NSMutableDictionary alloc ] initWithDictionary:[CredencialesFTP obtainPlist] ];
ajustesCredencialesTableViewController.nombre = [credenciales objectForKey:@"nombre"];
ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"];
[credenciales release];

это код dataFilePath:

+(NSString *)dataFilePath{  
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kCredenciales];
}

Утечка в вызове метода getPlist. Я пытался autorelease nsmutabledictionary, но это не работает, какие-либо идеи? спасибо.

Ответы [ 4 ]

0 голосов
/ 27 декабря 2010

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

Код выглядит хорошо для меня.

0 голосов
/ 27 декабря 2010

Вы должны использовать этот тип объявления функции в этом случае:

-(NSMutableDictionary *)obtainPlist

вместо:

+(NSMutableDictionary *)obtainPlist
0 голосов
/ 27 декабря 2010

Во-первых, какой объект протекает?

Инструменты скажут вам это; какой именно объект протекает и на какую строку кода он был выделен.

Как только вы это сделаете, вам следует включить «счетчик ссылок на треки» в инструменте «Распределения» и посмотреть последовательность удержаний / выпусков.

В опубликованном вами коде нет утечки. Скорее всего, существует переменная экземпляра, которая не равна release d в dealloc или , когда вы переопределяете переменную без предварительного release старого значения.

т.е:.

id foo = [Foo new];
foo = [Bar new]; // this leaks the Foo instance
foo = [Baz new]; // this leaks the Bar instance
<Ч />

Когда вы включаете запись подсчета ссылок, что удерживает и выпускает просочившийся словарь?

alt text

(Вы также можете включить «Отслеживать только активные распределения» при отслеживании утечек.)

<Ч />

Aha! Теперь мы куда-то добираемся!

Итак, протекший объект - это NSCFString; NSString для всех намерений и целей.

У вас есть эта строка кода:

ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"];

Итак, где вы release вводите строку, назначенную свойству password? Предполагая, что ваше свойство пароля определено как retain или copy (оно должно быть copy), вам нужно его где-то освободить.

Обратите внимание, что вы никогда не должны хранить пароли . Никогда не. Хеш пароль с солью и хранить его вместо этого.

0 голосов
/ 27 декабря 2010

возможно, утечка произошла в [self dataFilePath] или вы можете попытаться не alloc-init ваш словарь:

NSMutableDictionary *credenciales = [CredencialesFTP obtainPlist];
ajustesCredencialesTableViewController.nombre = [credenciales objectForKey:@"nombre"];
ajustesCredencialesTableViewController.password = [credenciales objectForKey:@"password"];

// РЕДАКТИРОВАТЬ: поэтому, если утечка происходит в obtainPlist, вы можете попробовать оба метода отдельно и посмотреть, какой именно утечка создает.

первая попытка

+(NSMutableDictionary *)obtainPlist{
    [[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]];
    return nil;
}

, а затем

+(NSMutableDictionary *)obtainPlist{
    return [NSMutableDictionary dictionaryWithContentsOfFile:[self dataFilePath]];
}

только для отладки и устранения проблемы.

...