2013-07-21 2 views
0

У меня есть класс viewController A, у которого есть метод, создающий UIAlertView и реализующий метод делегирования UIAlertView, и класс класса NSObject для обработки журналов и сетей. В классе B просто выделите экземпляр класса A, затем вызовите метод A. Вид предупреждения был отображен нормально, но когда я нажал кнопку «Ok», он просто разбился. Я хочу нажать кнопку «ОК», чтобы открыть клавиатуру, чтобы пользователь мог продолжить вход после сбоя. (Объявивший протокол UIAlertView в заголовочном файле.)Вызов метода делегирования UIAlertView разбился

В ViewController класса А:

- (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, я назвал отображение предупреждений метод просмотра в failure block из AFNetworking.

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', но все же разбился, что случилось с этим? –

Смежные вопросы