2013-07-21 73 views
0

我有一个viewController类A有一个方法创建一个UIAlertView并实现UIAlertView委托方法,和NSObject模型类B处理日志记录和网络。在B类中,只分配一个A类实例,然后调用A的方法。警报视图显示正常,但是当我点击“确定”按钮时,它只是崩溃。我想单击“确定”按钮重新打开键盘,让用户在失败后继续登录。 (已有在头文件中声明UIAlertView中协议。)调用UIAlertView委托方法崩溃

在ViewController中A类:

- (void)displayAlertViewString:(NSString *)string 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login Failured!" 
                message:string 
                delegate:self 
              cancelButtonTitle:nil 
              otherButtonTitles:@"Ok", nil]; 
    [alert show]; 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 

    if ([title isEqualToString:@"Ok"]) 
    { 
     //reopen the keyboard let user continue login. 
     [self.passwordField becomeFirstResponder[; 
    } 

而在模型类B,I称为在AFNetworkingfailure block显示警报视图方法。

failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
     NSLog(@"%@", error); 

     RDLoginViewController *loginViewController = [[RDLoginViewController alloc] init]; 

     [loginViewController displayAlertViewString:@"The entered email or password was incorrectly!"]; 

调试器中没有任何信息,Xcode只是停留在线程视图中。任何人都可以帮我弄明白吗?谢谢。

回答

0

执行失败块后,loginViewController从内存中释放,因为没有人强烈引用它。

当alertView尝试访问它的委托时,它会崩溃,因为它的委托不在内存中了。

我建议你看看Advanced Memory Management Programming Guide

+0

谢谢。我怎么能阻止从内存释放?为什么在失败块执行后,对象应该被释放? –

+0

它被释放,因为没有强引用它。这里的答案将取决于您的应用程序的体系结构。根据你已经显示的内容,在类中创建一个触发AFNetworking请求的强属性似乎是合理的,而不是在失败块上分配和启动它。 –

+0

我在头文件中添加一个类属性,而不是在'success block'中初始化类,但仍然崩溃,这有什么问题? –