alertView:clickedButtonAtIndex:导致程序关闭

时间:2011-04-21 10:36:41

标签: objective-c iphone

我有这段代码分配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];
}

我做错了什么?

6 个答案:

答案 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方法只需删除它