我正在使用仪器检测一些泄漏,并且有一些我无法解决的泄漏;
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的泄漏不是泄漏。
对于第一次泄漏,再次发生泄漏!!!
答案 0 :(得分:1)
在第一种情况下,在我看来,你没有发布两个变量:textedetails
和texterecap
(至少,你没有在显示的代码中这样做)。目前尚不清楚你接下来要用这些字符串做什么(分配属性?),如果你显示更多代码,我可能会进一步帮助你。
您的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];