我在主线程上显示UIAlertView
时遇到问题。尽管我在主线程上运行,但我不确定为什么会一直崩溃。下面的块在后台线程上,但我在main上有警报,如下所示:
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
错误。有人可以解释一下原因吗?它是在正确的线程上,我不能让我的生活了解内存问题可能来自哪里!
答案 0 :(得分: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];
}
});
}).
答案 1 :(得分:0)
这是您呈现提醒视图的方式:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"<#(NSString *)#>" message:@"<#(NSString *)#>" delegate:self cancelButtonTitle:@"<#(NSString *)#>" otherButtonTitles:nil];
[alert show];
[alert release];
答案 2 :(得分:0)
为什么不使用目标C调用而不是使用dispatch_async:
[self performSelectorOnMainThread
您可能必须使用自己的方法将其打包。或者,使用以下方式调用它:
[self performSelector:@selector(myAlertMethod) withObject:nil afterDelay:0.25]
从第1天开始,这些方法就已经尝试过了。