【问题标题】:Xcode 6 Swift WebThread crash with EXC_BAD_ACCESS errorXcode 6 Swift WebThread 崩溃并出现 EXC_BAD_ACCESS 错误
【发布时间】:2015-09-05 15:10:19
【问题描述】:

我正在使用 Xcode 6 和 Swift 在 iOS 应用程序中通过 UIWebView 显示 PDF 文件,如下所示:

@IBOutlet weak var displayWebView: UIWebView!

func displayView(viewfile: NSData){
    displayWebView.loadData(viewfile, MIMEType: "application/pdf", textEncodingName: "UTF-8", baseURL: nil)
}

viewfile 是一个 NSData,来自上一个屏幕中的 segue,它是一个 tableview。

PDF 显示正常。但是当应用程序在前一个屏幕来回切换时,应用程序在“loadData”步骤中崩溃,并显示“WebThread (xx): EXC_BAD_ACCESS (code=EXC_I386_GPFLT)”消息,如下所示:

libobjc.A.dylib`objc_msgSend:
    0x106da3000 <+0>:   testq  %rdi, %rdi
    0x106da3003 <+3>:   jle    0x106da3068               ; <+104>
    0x106da3005 <+5>:   movq   (%rdi), %r11
    0x106da3008 <+8>:   movq   %rsi, %r10
->  0x106da300b <+11>:  andl   0x18(%r11), %r10d    WebThread (24): EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    0x106da300f <+15>:  shlq   $0x4, %r10
    0x106da3013 <+19>:  addq   0x10(%r11), %r10
    0x106da3017 <+23>:  cmpq   (%r10), %rsi

有时,错误是:

WebKitLegacy`-[WebDataSource(WebPrivate) dataSourceDelegate]:
    0x10c51dbb0 <+0>:  pushq  %rbp
    0x10c51dbb1 <+1>:  movq   %rsp, %rbp
    0x10c51dbb4 <+4>:  movq   0x11ad95(%rip), %rax      ; WebDataSource._private
    0x10c51dbbb <+11>: movq   (%rdi,%rax), %rax
->  0x10c51dbbf <+15>: movq   0x18(%rax), %rax     WebThread (17): EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    0x10c51dbc3 <+19>: popq   %rbp
    0x10c51dbc4 <+20>: retq   
    0x10c51dbc5 <+21>: nopw   %cs:(%rax,%rax)

无论目标是 iOS 8 还是 iOS 7,这些崩溃都会发生,而且崩溃的地方看起来是随机的。尽管有类似症状的类似帖子,但它们是 Objective-C 解决方案而不是 Swift。

有人会告知 Swift 中问题的解决方案吗?

【问题讨论】:

  • 查看代码是否从主线程执行,如果不是,则让它从该线程执行,以防万一。
  • 代码不是从主线程执行,而是从 getDataInBackgroundWithBlock 中的一个块从 parse.com 获取数据,然后在块中执行 loaddata 以确保在显示之前提取数据。如果从主线程执行 loaddata,它不知道块已经完成。在这种情况下,我怎么知道(在主线程中)getDataInBackgroundWithBlock 已经完成然后执行 loaddata?

标签: ios xcode swift uiwebview exc-bad-access


【解决方案1】:

为什么在调用“loadData”后不更新视图?块内的执行相对于其线程仍然是同步的。

[query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { if (error) { //handle error } else { dispatch_async(dispatch_get_main_queue(), ^{ [self loadData]; [self updateView]; }); } }];

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多