0

我下面的代码工作正常,但是当我添加UIAlertView它的开始给我exc_bad_access并且应用程序被挂起时,

主要思想是在检测到时间戳时显示警报,

任何提示我做错了什么?

- (void) onPayload:(PayloadEvent *) event {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *header = @"[OnPayload] ";
if (event.payloadType == TYPE_IDENTIFIED) {

   if ((event.contentID != -1) && (event.timeStamp == -1)) {

        [mUI performSelectorOnMainThread: @selector(Trace:) withObject:[NSString stringWithFormat:@"%@ StaticID detected: %x\t\tConfidence: %f\n", header,(int)event.contentID, event.confidence]  waitUntilDone:NO];

    }

    if ((event.timeStamp != -1) && (event.contentID == -1)) {

        [mUI performSelectorOnMainThread: @selector(Trace:) withObject:[NSString stringWithFormat:@"%@ Timestamp detected: %f\t\tConfidence: %f\n", header, event.timeStamp, event.confidence]  waitUntilDone:NO];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Poll" message:@"MY alert Poll" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

        [alert show];

        [alert release];
    }

}

else if (event.payloadType == TYPE_NOT_IDENTIFIED) {

    [mUI performSelectorOnMainThread: @selector(Trace:) withObject:[NSString stringWithFormat:@"%@ Content not marked\n", header]  waitUntilDone:NO];

}

else if (event.payloadType == TYPE_MARKED_BUT_NOT_IDENTIFIED) {

    [mUI performSelectorOnMainThread: @selector(Trace:) withObject:[NSString stringWithFormat:@"%@ Content marked but not identified\n", header]  waitUntilDone:NO];

}

[event release];
[pool release];

}

我的错误出现在这里

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Poll" message:@"MY alert Poll" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

[alert show];  <<=====

[alert release];
4

2 回答 2

2

任何更改 UI 的代码都应该从主线程调用:

dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Poll" message:@"MY alert Poll" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
    [alert show];
    [alert release];
});

与某些评论相反,显示警报的视图将保留UIAlertView实例,因此无需调用autorelease而不是release.

于 2013-05-28T08:33:10.003 回答
1

考虑到您-performSelectorOnMainThread在同一方法中调用了几次,我想它是在后台线程上调用的。UI 更改必须发生在主线程上,因此,您应该[alert show];在主线程上调用以绕过错误。

[alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];
于 2013-05-28T08:06:37.963 回答