0
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];

当我在此代码上运行分析时,我在行收到错误“引用计数的对象在它被释放后被使用”[av release];

我能知道,在哪里发布了 av,UIAlertView 的显示功能是否发布了 av?

奇怪的是,下面的代码在使用分析工具时没有显示任何错误

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];
}
4

3 回答 3

1

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

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

于 2012-11-27T10:45:13.233 回答
1

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

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

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

[av initWithTitle:...]

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

于 2012-11-27T10:57:11.700 回答
0

show函数没有释放UIAlertViewif 它是这里的问题(在第二个代码中)。

于 2012-11-27T10:46:40.130 回答