泄漏on appendFormat

时间:2011-08-17 11:12:59

标签: iphone ios xcode memory-leaks

我正在使用仪器检测一些泄漏,并且有一些我无法解决的泄漏;

        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

编辑:

显然,alertview的泄漏不是泄漏。

对于第一次泄漏,再次发生泄漏!!!

3 个答案:

答案 0 :(得分:1)

在第一种情况下,在我看来,你没有发布两个变量:textedetailstexterecap(至少,你没有在显示的代码中这样做)。目前尚不清楚你接下来要用这些字符串做什么(分配属性?),如果你显示更多代码,我可能会进一步帮助你。

您的dealloc方法非常不正确;它应该是:

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

我不知道这是否也可以解决报告的工具,因为在对象上调用dealloc是非常不寻常的(即,我不知道它可能产生什么影响)。

此外,您似乎没有发布recapitulatif

在第二种情况下,警报视图没有被正确解雇,我猜。代码是正确的;我只会尝试实现委托协议,以查看是否实际调用了– alertView:willDismissWithButtonIndex:方法。

答案 1 :(得分:0)

在第一个示例中,您将分配/初始化两个NSMutableStrings而不调用它们。 UIAlertView用法看起来没问题。

尝试在Xcode中使用Analyze功能。它将指出泄漏发生的位置并解释原因。

答案 2 :(得分:0)

为什么你真的想要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];