Iphone 主队列崩溃时的UIAlertView。

Iphone 主队列崩溃时的UIAlertView。,iphone,objective-c,ios6,uialertview,exc-bad-access,Iphone,Objective C,Ios6,Uialertview,Exc Bad Access,在主线程上显示UIAlertView时出现问题。我不知道为什么,但它一直崩溃,尽管我在运行主线程。以下块位于后台线程上,但我在主线程上有如下警报: void (^removeFromCalendar)(NSString *, NSString *, EKEventStore *) = ^(NSString *error, NSString *eventKey, EKEventStore *eventDB) { EKEvent *myEvent = [eventDB eventWithId

在主线程上显示
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\u BAD\u ACCESS
错误。有人能解释一下原因吗?这是在正确的线程,我不能为我的生活理解的记忆问题可能来自哪里

这是显示警报视图的方式:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"<#(NSString *)#>" message:@"<#(NSString *)#>" delegate:self cancelButtonTitle:@"<#(NSString *)#>" otherButtonTitles:nil];
    [alert show];
    [alert release];
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@”“消息:@”“委托:自取消按钮:@”“其他按钮:无];
[警报显示];
[警报发布];

可能是您在完成后台队列之前,正在释放视图。所以,为了安全起见,你为什么不这样使用它

...........
  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];
            }
        });
}).

与其使用dispatch_async,不如使用objective C调用:

[self performSelectorOnMainThread
您可能需要用自己的方法将其打包。或者,使用以下方法调用它:

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

这些方法从第1天起就得到了验证。

如果您没有在Objective-C异常上设置断点,请添加一个断点。它通常比EXC_BAD_ACCESS产生更好的错误信息。我该如何做?这是通过探查器实现的吗?Xcode主屏幕的左视图顶部有一组图标。其中一个叫做断点导航器。打开该视图,底部有一个“+”用于添加断点。是否尝试使用
dispatch\u sync
而不是
dispatch\u async
?我在pastI中遇到了一些奇怪的问题,我无法想象这实际上会有所帮助,但在创建
UIAlertView
时,除了在
otherButtonTiles:
参数之后去掉额外的
nil