gpt4 book ai didi

ios - 在 Swift 中使用 EXC_BAD_ACCESS 对自身的异步 block 调用崩溃

转载 作者:行者123 更新时间:2023-11-29 02:19:40 24 4
gpt4 key购买 nike

我有一个 API 调用(使用 AFNetworking),当失败时调用失败 block 。此 block 通过'self.refreshController.stopRefreshing(); 简单地停止 TableView 刷新 Controller ;但是在运行时这会导致 EXC_BAD_ACCESS 错误。

failure: { (error: NSError!, reason: String!) -> Void in
self.refreshController.endRefreshing()
}

我已经尝试将调用放入“dispatch_async”主队列,但调用已经在主队列中,并且出现相同的错误。

failure: { (error: NSError!, reason: String!) -> Void in
dispatch_async(dispatch_get_main_queue())
{
self.refreshController.endRefreshing()
}
}

这让我相信问题是在调用失败 block 时与指向“ self ”的指针有关......我已经尝试过“弱”和“无主” self ,但这些都没有解决它。

failure: { [weak self] (error: NSError!, reason: String!) -> Void in
self?.refreshController.endRefreshing()
}

欢迎任何想法。

更新:初始化

class ResultsViewController: UIViewController, UITableViewControllerDelegate, UITableViewControllerDataSource 
{
var refreshController = UIRefreshControl()

override func viewDidLoad()
{
super.viewDidLoad()
// pull-to-refresh setup
self.refreshController.addTarget(self, action: "refreshTable:", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(self.refreshController)
}
}

最佳答案

终于找到根本原因了。

我使用 AFNetworking 进行 API 调用,并创建了一个自定义失败 block ,其中包括 API 调用失败的原因。这是调用堆栈中的链的上游,但这个错误似乎掩盖了它。上述方法都不是必需的,但使用弱 self 方法确实帮助编译器在正确的文件中显示问题。

问题可以追溯到这里:

两个 block 类型别名

typealias SuccessBlock = (responseArray: AnyObject!) -> Void
typealias FailureBlock = (error: NSError, reason: String) -> Void

AFNetworking POST 调用

private func post(url: String, inout parameters: [String : AnyObject], success: SuccessBlock, failure: FailureBlock)
{
self.sessionManager.POST(url,
parameters: parameters,
success: { (operation: NSURLSessionDataTask!, responseObject: AnyObject!) -> Void in
println("DEBUG: API POST Request to \(url) successful.")
var responses = responseObject as? [AnyObject]
success(responseArray:responses)
},
failure: { (operation: NSURLSessionDataTask!, error: NSError!) -> Void in
let reason = self.getResponseReasonFromError(error)
println("DEBUG: API GET Request to \(url) \nFailed: \(error). \nAPI Response: \(reason)")
failure(error: error, reason: reason)
}
)
}

FailureBlock 类型别名中出现错误

typealias FailureBlock = (error: NSError, reason: String) -> Void
typealias FailureBlock = (error: NSError, reason: String!) -> Void

缺少一个!在字符串之后。

关于ios - 在 Swift 中使用 EXC_BAD_ACCESS 对自身的异步 block 调用崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28301668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com