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];
}
答案 0 :(得分:1)
在你的第一个代码中,对象“av”不确定是否被初始化,如果a的值不是1 0r 2怎么办? av不会被初始化,所以当你发布它时会出现一些问题。
在你的第二个代码中,av的范围变得更加具体或局限于if和else的条件。这就是为什么xcode确定av将被初始化并且可以安全地释放av。
答案 1 :(得分:1)
您必须始终使用任何init
调用的返回值,因为init
函数可以返回不同的值。因此,如果您真的想要将alloc
和init
分开,那么您必须这样做:
UIAlertView *av = [UIAlertView alloc];
// ...
av = [av initWithTitle:...]; // Might change the value of av !!
[av show];
[av release];
代码中的“虚假发布”发生在这里:
[av initWithTitle:...]
因为这可能(如上所述)释放av
并返回不同的对象。
答案 2 :(得分:0)
show
函数未释放UIAlertView
如果这是问题(在第二个代码中)。