UIAlertView和内存泄漏

时间:2012-11-27 10:27:52

标签: objective-c ios

UIAlertView* av = [UIAlertView alloc];

int a = [self somefunc];
if (a == 1) 
{
    [[av initWithTitle:nil message:@"test msg 1" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
} 
else if (a == 2) 
{
    [[av initWithTitle:nil message:@"test msg 2" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
} 

[av release];

当我对此代码运行anlyze时,我收到错误“在发布后使​​用refence count object对象”[av release];

我可以知道,av发布后,会显示UIAlertView发布的功能吗?

以下代码在使用分析工具时未显示任何错误

if (a == 1) 
{

    UIAlertView* av = [[UIAlertView alloc] initWithTitle:nil message:@"test msg 1" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [av show];
    [av release];
} 

else if (a == 2) 
{
    UIAlertView* av = [[UIAlertView alloc] initWithTitle:nil message:@"test msg 1" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [av show];
    [av release];
}

3 个答案:

答案 0 :(得分:1)

在你的第一个代码中,对象“av”不确定是否被初始化,如果a的值不是1 0r 2怎么办? av不会被初始化,所以当你发布它时会出现一些问题。

在你的第二个代码中,av的范围变得更加具体或局限于if和else的条件。这就是为什么xcode确定av将被初始化并且可以安全地释放av。

答案 1 :(得分:1)

您必须始终使用任何init调用的返回值,因为init函数可以返回不同的值。因此,如果您真的想要将allocinit分开,那么您必须这样做:

UIAlertView *av = [UIAlertView alloc];
// ...
av = [av initWithTitle:...]; // Might change the value of av !!
[av show];
[av release];

代码中的“虚假发布”发生在这里:

[av initWithTitle:...]

因为这可能(如上所述)释放av并返回不同的对象。

答案 2 :(得分:0)

show函数未释放UIAlertView如果这是问题(在第二个代码中)。