【问题标题】:UIAlertView is causing a EXC_BAD_ACCESS and app hangUIAlertView 导致 EXC_BAD_ACCESS 和应用程序挂起
【发布时间】:2013-05-28 16:36:17
【问题描述】:

我的以下代码运行良好,但是当我添加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];

【问题讨论】:

  • 啊,我想可能是版本导致了这个。您可以尝试将警报设置为自动释放吗?或者,通过启用 ARC 来解决所有内存管理问题。

标签: objective-c xcode uialertview


【解决方案1】:

任何改变 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];
});

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

【讨论】:

    【解决方案2】:

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

    [alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:NO];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多