我有这段代码分配2个UIAlertView:
promptConnexion = [[UIAlertView alloc] initWithTitle:@"Connexion"
message:@"\n\n\n"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
promptConnexion.tag = 1;
promptInscription = [[UIAlertView alloc] initWithTitle:@"Inscription"
message:@"\n\n\n\n\n"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"OK", nil];
promptInscription.tag = 2;
这个指定按下按钮时要执行的操作:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.tag == 1)
{
if (buttonIndex == 1)
{
NSLog(@"Connexion button OK");
}
}
if (alertView.tag == 2)
{
if (buttonIndex == 1)
{
NSLog(@"Inscription button OK");
}
}
}
在我的控制台中,当我应该时,我实际上得到“Connexion按钮OK”和“Inscription按钮OK”。
但是在我的程序意外关闭之后,我的控制台中没有任何警告或错误。
此外,如果我没有重载alertView:clickedButtonAtIndex:我的UIAlertView刚刚关闭,我的应用程序仍然可以正常运行,但我的按钮什么都不做(显然)。
我也写了这段代码:
以这种方式显示我的2 UIAlertView:
[promptConnexion show]; [promptConnexion release];
和:
[promptInscription show]; [promptInscription release];
并重载了alertView:didDismissWithButtonIndex:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { [alertView release]; }
我做错了什么?
答案 0 :(得分:1)
这是你的问题;
[alertView release];
你根本不想这样做。事实上,如果你在方法中做的就是这样,你也可以完全删除方法。这导致使用[promptConnexion release]等已经发布的警报视图的双重释放。
检测此类内容的一种方法是使用NSZombiesEnabled运行程序,因为当您尝试释放已发布的对象时,可以显示该程序。
答案 1 :(得分:1)
此代码是您的问题:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex: (NSInteger)buttonIndex
{
[alertView release]; // Should not be released here!
}
原因是,您已经在这里发布了alertView:
[promptConnexion release];
[promptInscription release];
您已通过释放已分配的对象完成了“任务”。警报视图对象现在由显示该警报视图的操作系统负责,并且在必要时将其释放,而无需您的任何操作。
只需删除该代码即可。
此外,您应该阅读Apple's Memory Management Rules以更好地了解此问题
答案 2 :(得分:0)
[promptInscription release];
和[promptConnexion release];
已经发布了alertViews。您正在发布它,然后在访问这些警报视图的标记后再然后再次发布,我认为这是崩溃的原因。
答案 3 :(得分:0)
你不应该在
中发布alertView- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
您已经发布了alertView实例,因此无需释放..
答案 4 :(得分:0)
请尝试不在下方功能中发布 alertView 。
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex`
所以你的功能应该是
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
//Put you code here
}
答案 5 :(得分:0)
只需做一件事就可以编写如下代码
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (alertView.tag == 1)
{
if (buttonIndex == 1)
{
NSLog(@"Connexion button OK");
}
}
if (alertView.tag == 2)
{
if (buttonIndex == 1)
{
NSLog(@"Inscription button OK");
}
}
}
无需覆盖clickedButton Index方法只需删除它