iPhone - 这段代码怎么泄漏?

时间:2010-09-25 02:38:07

标签: iphone

非常简单的代码,但是泄密了......检查出来。

- (void)loadView {

    NSString * myTitle = @"HELLO";
    NSString * message = @"\nThis stuff is leaking!\n";
    NSString * cancelButton = @"Dismiss";
    NSString * otherTitles = nil;
    [self showAlert: myTitle : message: cancelButton : otherTitles];


}


- (void) showAlert: (NSString *) titulo : (NSString *) mensagem : (NSString *) cancelButton : (NSString *) otherButton {

    UIAlertView * alertView = nil;

    if (otherButton) {

        alertView = [[UIAlertView alloc]
                     initWithTitle:titulo
                     message:mensagem 
                     delegate:self cancelButtonTitle:cancelButton
                     otherButtonTitles:otherButton, nil ];

    } else {

        alertView = [[UIAlertView alloc]
                     initWithTitle:titulo
                     message:mensagem 
                     delegate:self cancelButtonTitle:cancelButton
                     otherButtonTitles:nil ];
    }

    [alertView show];
    [alertView release];

}

这是项目,如果你想尝试自己的乐器...... http://www.mediafire.com/download.php?hml2hl5laz9ez2j

我该如何解决?

感谢。

4 个答案:

答案 0 :(得分:1)

我试图在仪器中自己运行它,而且我没有得到这些泄漏。代码的其他部分一定有问题,但这对我来说似乎很好。

我唯一能选择的是showAlert:[self showAlert: myTitle : message: cancelButton : otherTitles];的运行方式。我认为这很难看,你应该将功能改为

- (void) showAlertWithTitle:(NSString *)title message:(NSString *)message cancelButton:(NSString *)cancelButton otherButton:(NSString *)otherButton

并使用[self showAlertWithTitle:title message:message cancelButton:cancelButton otherButton:otherButton];运行它。

答案 1 :(得分:1)

代码似乎没有任何问题,甚至我已经想通了一些完全正确的代码也显示出一些泄漏,现在就我在某处阅读,即使使用分析工具也会显示一些泄漏因为工具本身就存在变量以防以后可能使用。

因此,最好的方法是将所有内容初始化为自动释放,并始终使用合成属性以避免泄漏。

如果您使用自动释放局部变量并且只使用合成属性来保存长期实例,那么分析器知道它不需要保留变量。

答案 2 :(得分:1)

所以,它似乎是一个框架泄漏。我正在向Apple报告此事。

答案 3 :(得分:0)

如果你自动发布UIAlert,你还会得到内存错误吗?所以,将其改为:

alertView = [[[UIAlertView alloc]
                 initWithTitle:titulo
                 message:mensagem 
                 delegate:self cancelButtonTitle:cancelButton
                 otherButtonTitles:otherButton, nil ] autorelease;

您还应该删除[alertView release];行。

但你是对的,这里我没有明显的记忆错误。