Утечка на appendFormat - PullRequest
       22

Утечка на appendFormat

0 голосов
/ 17 августа 2011

Я использую инструменты для обнаружения некоторых утечек, и есть некоторые утечки, которые я не могу устранить;

        NSMutableString *textedetails = [[NSMutableString alloc] init];   ------->2,3%
                if([dico objectForKey:@"alertSerie"] != nil)
                    {[textedetails appendFormat:@"Numéro de Série: %@ \n",[dico objectForKey:@"alertSerie"]];}
                if([dico objectForKey:@"alertDate"] != nil)
                    {[textedetails appendFormat:@"Date de mise en service: %@ \n",[dico objectForKey:@"alertDate"]];}
                if([dico objectForKey:@"alertCli"] != nil)
                    {[textedetails appendFormat:@"Nom du client associé: %@ \n",[dico objectForKey:@"alertCli"]];}     ------->20,9%

                NSMutableString *texterecap = [[NSMutableString alloc] init];------->2,3%
                if([dico objectForKey:@"alertIndex"] != nil)
                {[texterecap appendFormat:@"Index du Compteur: %@ \n",[dico objectForKey:@"alertIndex"]];}
                if([dico objectForKey:@"alertE2day"] != nil)
                {[texterecap appendFormat:@"Energie produite aujourd'hui: %@ \n",[dico objectForKey:@"alertE2day"]];}
                if([dico objectForKey:@"alertEmo"] != nil)
                {[texterecap appendFormat:@"Energie produite ce mois-ci: %@ \n",[dico objectForKey:@"alertEmo"]];}
                if([dico objectForKey:@"alertEy"] != nil)
                {[texterecap appendFormat:@"Energie produite cette année-ci: %@ \n",[dico objectForKey:@"alertEy"]];}
                if([dico objectForKey:@"alertCO"] != nil)
                {[texterecap appendFormat:@"CO2 économisé cette année: %@ \n",[dico objectForKey:@"alertCO"]];}
                if([dico objectForKey:@"alertPerfRel"] != nil)       
                {[texterecap appendFormat:@"Performance relative: %@ \n",[dico objectForKey:@"alertPerfRel"]];}      ------->74,4%

    [dico release];
details.numberOfLines=0;    // Pour mettre le nombre de lignes possibles à infini.
        details.text = [NSString stringWithFormat:@"%@", textedetails ];
        recapitulatif.numberOfLines=0;
        recapitulatif.text = [NSString stringWithFormat:@"%@", texterecap ];

        [textedetails release];
        [texterecap release];

...

- (void)dealloc {
    [login dealloc];
    [motdepasse dealloc];
    [responseData dealloc];
    [super dealloc];
}

И здесь:

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login et Mot de passe" message:@"Votre login et votre mot de passe sont enregistrés."delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];[alert release]; ------> 100%

Я не понимаю этих утечек и как их устранить!

Благодаря мне: D

РЕДАКТИРОВАТЬ:

Видимоутечка для просмотра предупреждений не является утечкой.

Для первой утечки снова возникает утечка !!!

Ответы [ 3 ]

1 голос
/ 17 августа 2011

В первом случае мне кажется, что вы не освобождаете две переменные: textedetails и texterecap (по крайней мере, вы не делаете это в показанном коде).Непонятно, что вы будете делать с этими строками (присвоение свойств?), Если вы покажете еще немного кода, я смогу помочь вам в дальнейшем.

Ваш dealloc метод совершенно не верен;это должно быть:

- (void)dealloc {
    [login release];
    [motdepasse release];
    [responseData release];
    [super dealloc];
}

Я не знаю, может ли это также решить, какие инструменты сообщают, поскольку довольно необычно вызывать dealloc для объекта (т.е. я не знаю, какие эффектыэто может иметь).

Кроме того, кажется, что вы не отпускаете recapitulatif.

Во втором случае, я думаю, представление предупреждения не корректно отклоняется.Код правильный;Я только попытался бы реализовать протокол делегата, чтобы увидеть, действительно ли вызывается метод – alertView:willDismissWithButtonIndex:.

0 голосов
/ 17 августа 2011

Почему вы действительно хотите NSMutuableString

вы могли бы использовать

NSString *textedetails;;
NSString *texterecap;
if([dico objectForKey:@"alertSerie"] != nil){
    [textedetails stringByAppendingFormat:@"Numéro de Série: %@ \n",[dico objectForKey:@"alertSerie"]];
}
if(....){}
details.text = [NSString stringWithFormat:@"%@", textedetails ];
recapitulatif.numberOfLines=0;
recapitulatif.text = [NSString stringWithFormat:@"%@", texterecap ];


** this is autoreleased instance, so you do not need to call explicitly release on them **

вам нужно освободить только тот объект, который создан с использованием метода, имя которого начинается с «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy).

и в вашем втором вопросе, если бы вы передавали делегата как самого себя, я не думаю, что это будет утечка. (согласно вашему комментарию) я думаю, что тогда что-то не так, потому что приведенный ниже код для представления предупреждений никогда не просочится.

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login et Mot de passe" message:@"Votre login et votre mot de passe sont enregistrés." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
0 голосов
/ 17 августа 2011

В первом примере вы выделяете / инициируете две NSMutableStrings без вызова release для них.Использование UIAlertView выглядит нормально.

Попробуйте использовать функцию Анализ в XCode.Он укажет, где происходят утечки, и объяснит, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...