奇怪的Swift崩溃堆栈EXC_BREAKPOINT 0x00000000e7ffdefe

9
我正在尝试调试以下崩溃,并且对这个错误的含义有些不清楚。我从使用iPhone应用程序的用户那里得到了这个错误,并且该崩溃是通过Crashlytics传递过来的。
崩溃标题为:EXC_BREAKPOINT 0x00000000e7ffdefe 崩溃位置为: com.apple.main-thread
线程: Crashed: com.apple.main-thread 0 Mutual 0xfff58 AlbumViewController.(getFacebookAlbums(() -> ()) -> ()).(closure #1) (AlbumViewController.swift:78) 1 Mutual 0xfe95c partial apply for AlbumViewController.(getFacebookAlbums(() -> ()) -> ()).(closure #1) (AlbumViewController.swift) 2 Mutual 0xfe95c partial apply for AlbumViewController.(getFacebookAlbums(() -> ()) -> ()).(closure #1) (AlbumViewController.swift) 3 FBSDKCoreKit 0x5a2661 -[FBSDKGraphRequestMetadata invokeCompletionHandlerForConnection:withResults:error:] + 96
它指向的代码(AlbumViewController的第78行)是此函数的结束括号。
func getFacebookAlbums(completion: (() -> Void)? = nil){
    FBSDKGraphRequest(graphPath: "me/albums?fields=name,picture,count&limit=16&offset=\(offset)", parameters: nil).startWithCompletionHandler { (connection: FBSDKGraphRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
        if let albumData = result["data"] as? NSArray{

            for album in albumData{
                let albumName = album["name"] as? String ?? ""
                let albumId = album["id"] as? String ?? "-1"
                let count = album["count"] as? Int ?? 0
                var coverURL = ""
                if let picture = album["picture"] as? NSDictionary{
                    if let pictureData = picture["data"] as? NSDictionary{
                        coverURL = pictureData["url"] as? String ?? ""
                    }
                }

                let newAlbum = AlbumData(name: albumName, id: albumId, coverURL: coverURL, photosCount: count)
                self.albums.append(newAlbum)
            }

            self.albumView.tableView.reloadData()
            self.albumView.tableView.hidden = false
            self.albumView.loadingView.hideLoadingView()

            completion?()
            self.downloadAlbumThumbnails()
        }
    }
}

这个错误信息过于模糊,非常难以调试。有没有人了解是什么原因导致的?

更新:

这里是从Crashlytics中获取到的屏幕截图:

Crash Data

这是方法调用和闭包内容:

    getFacebookAlbums { () -> Void in
        self.albumView.activityIndicator.stopAnimating()
        self.albumView.refreshContorl.endRefreshing()
    }

在崩溃之前有没有任何输出?这可能是一个致命错误。 - jtbandes
@Christopher 这个 bug 非常间歇性,而且从来没有在我的设备或模拟器上崩溃过,所以设置断点并不起作用,因为我无法重现崩溃,我只有从外部测试人员那里得到的崩溃日志。 - Unome
@jtbandes 我已经更新了我的帖子并提供了更多信息。在崩溃之前,我没有任何输出。fatalError是什么意思? - Unome
@Unome,你找到问题了吗? - Libor Zapletal
1
@Unome,不确定这是否与此有关,但您正在从请求闭包中调用tableView.reloadData,这可能意味着您不在主线程上。在主线程上执行此闭包是否有帮助? - Michael Curtis
显示剩余4条评论
1个回答

0

你必须传递self的弱引用。当self从内存中移除时,闭包仍然可以存在并尝试调用self,导致崩溃发生。


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