2012-11-23 9 views
2

У меня проблема с изображением UIAlertView на основной теме. Я не уверен, почему, но он продолжает рушиться, несмотря на то, что я бегу по основной теме. Следующий блок находится на фоновом потоке, но у меня есть предупреждение на основной, как показано ниже:UIAlertView при сбое основной очереди.

void (^removeFromCalendar)(NSString *, NSString *, EKEventStore *) = ^(NSString *error, NSString *eventKey, EKEventStore *eventDB) { 
    EKEvent *myEvent = [eventDB eventWithIdentifier:eventKey]; 
    NSError *err = noErr; 

    if(myEvent != NULL && myEvent != (id)[NSNull null]) { 
     [eventDB removeEvent:myEvent span:EKSpanThisEvent error:&err]; 
    } else { 

     // Event was not found, nothing to do 
     return; 
    } 

    [eventDB release]; 

    if (!err || err == noErr) { 
     NSLog(@"Deleted event %@", myEvent.title); 

     // Show alert on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Showing the alert for unattending 
      NSString *resultString = @"This event was removed from your calendar."; 
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Info" message:resultString delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease]; 
      [alert show]; 
     }); 

     return; 
    } 

    error = err.description; 
}; 

Если я закомментировать дно, где он показывает предупреждение, все хорошо. Но для предупреждения я продолжаю получать ошибку EXC_BAD_ACCESS. Может кто-нибудь объяснить, почему? Это на правильной нити, и я не могу, чтобы жизнь меня поняла, откуда может возникнуть проблема с памятью!

+1

Если вы не имеете точку останова, установленную на исключения Objective-C, добавьте один. Он ** обычно ** дает лучшую информацию об ошибках, чем EXC_BAD_ACCESS. –

+0

Как это сделать? Это через профайлер? – KVISH

+0

Левый вид главного экрана Xcode имеет набор значков вверху. Один из них называется Breakpoint Navigator. Откройте это представление, а внизу добавьте «+» для добавления точки останова. –

ответ

1

Может быть вы смотрите высвобождается, когда вы закончите, пока вы не закончите с фоном очереди. Итак, для безопасности, почему вы не используете его так:

........... 
    UIViewController __weak *myController = self; 
dispathch_async(backgroundQueue, ^{ 
    UIViewController __strong *myStrongController = myController; 
............... 
dispatch_async(dispatch_get_main_queue(), ^{ 
      if(myStrongController){ 
      // Showing the alert for unattending 
      NSString *resultString = @"This event was removed from your calendar."; 
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Info" message:resultString delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil] autorelease]; 
      [alert show]; 
      } 
     }); 
}). 
0

Это, как вы представить уведомление вид:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"<#(NSString *)#>" message:@"<#(NSString *)#>" delegate:self cancelButtonTitle:@"<#(NSString *)#>" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
+0

Да, попробовал это тоже – KVISH

0

Вместо использования dispatch_async, почему бы не использовать объективный вызов C:

[self performSelectorOnMainThread 

Вы, возможно, придется упаковать его в своем собственном методе. С другой стороны, назвать его помощью:

[self performSelector:@selector(myAlertMethod) withObject:nil afterDelay:0.25] 

Эти методы были опробованы и верно, так как день 1.

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