Xcode在设备上编译成功但在模拟器上失败

3

我正在使用CocoaPods与React Native应用程序。在Xcode模拟器中运行构建时,我遇到了各种错误。但在我的设备上运行时没有问题。当我启用断点时,以下是其中一个错误:

- (void)ensureOnJavaScriptThread:(dispatch_block_t)block
    {
      RCTAssert(_jsThread, @"This method must not be called before the JS thread is created");

这里的错误是绿色的(尽管在Xcode中出现了故障),并显示 com.facebook.react.JavaScript (9): breakpoint 1.2

当我禁用断点时,会出现两个错误,这是其中之一:

void Instance::loadApplication(std::unique_ptr<RAMBundleRegistry> bundleRegistry,
                                   std::unique_ptr<const JSBigString> string,
                                   std::string sourceURL) {
      callback_->incrementPendingJSCalls();
      SystraceSection s("Instance::loadApplication", "sourceURL",
                        sourceURL);
      nativeToJsBridge_->loadApplication(std::move(bundleRegistry), std::move(string),
                                         std::move(sourceURL));
    }

callback_-> 行上出现红色错误,错误信息为 EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

第二个问题是关于这段代码的 signal SIGABRT 错误:

int main(int argc, char * argv[]) { 
  @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}

我之前通过启用僵尸进程来解决过这个问题。当我这样做时,我在控制台上看到了以下内容:

2018-07-11 16:56:08.326 [info][tid:main][RCTRootView.m:293] Running application Mapp ({
initialProps =     {
};
rootTag = 11;
})
=================================================================
Main Thread Checker: UI API called on a background thread: -[UIApplication setNetworkActivityIndicatorVisible:]
PID: 34682, TID: 5546845, Thread name: (none), Queue name: com.mixpanel.20e6d2c2b6c431dfecfdfaa100ec0a11.0x7fa94db06940.network, QoS: 0
Backtrace:
4   Mapp                           0x0000000103a31dd9 -[MPNetwork updateNetworkActivityIndicator:] + 121
5   Mapp                           0x0000000103a2ec09 -[MPNetwork flushQueue:endpoint:] + 985
6   Mapp                           0x0000000103a2e7b0 -[MPNetwork flushEventQueue:] + 64
7   Mapp                           0x0000000103a10418 __32-[Mixpanel flushWithCompletion:]_block_invoke + 312
8   libdispatch.dylib                   0x000000010e3f47ab _dispatch_call_block_and_release + 12
9   libdispatch.dylib                   0x000000010e3f57ec _dispatch_client_callout + 8
10  libdispatch.dylib                   0x000000010e3fdbe5 _dispatch_queue_serial_drain + 1305
11  libdispatch.dylib                   0x000000010e3fe4fa _dispatch_queue_invoke + 328
12  libdispatch.dylib                   0x000000010e3fa344 _dispatch_queue_override_invoke + 726
13  libdispatch.dylib                   0x000000010e40136c _dispatch_root_queue_drain + 664
14  libdispatch.dylib                   0x000000010e401076 _dispatch_worker_thread3 + 132
15  libsystem_pthread.dylib             0x000000010e920169 _pthread_wqthread + 1387
16  libsystem_pthread.dylib             0x000000010e91fbe9 start_wqthread + 13

对我来说这是一篇难以理解的文章,我不知道哪里出了问题。需要提醒的是,即使启用断点,这个版本在我的设备上运行时也没有错误。这是我应该担心的吗?请帮忙!

1个回答

9
因为在您的代码中,UI API被调用在后台线程,所以请禁用xcode的Main Thread Checker。这样就可以解决问题了。

编辑Scheme --- > 诊断 --- > 运行时API检查 ---> Main Thread Checker (取消勾选此设置)

enter image description here

注意:始终在下面的方法中使用后台线程更新UI

或者

将您的[UIApplication setNetworkActivityIndicatorVisible:]方法放在DispatchQueue.main.async中。

    DispatchQueue.main.async { // Correct
        UIApplication.shared.isNetworkActivityIndicatorVisible = true // in swift 4
       [UIApplication setNetworkActivityIndicatorVisible:]// in objective-C
 }

https://developer.apple.com/documentation/code_diagnostics/main_thread_checker


谢谢Mahipal!一旦我这样做,我就不再看到错误了。但是这可能仍然是我需要处理的问题,对吗?或者只要在我的实际设备上运行良好,那就没事了吗? - Michael Wiebe
实际上,这是 Xcode 的插件,从 Xcode 9.0 开始可用,仅在模拟器调试时可以跟踪后台的 UI API。 - MAhipal Singh
那么我不需要修复它,因为它在我的设备上工作正常? - Michael Wiebe
我们有两种修复选项,一种是通过设置,另一种是使用代码。我在答案中都添加了。如果您通过设置进行了修复,那么没问题,它不会创建任何问题。 - MAhipal Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接