gpt4 book ai didi

ios - 转义闭包会导致 Release 配置中出现链接器错误

转载 作者:行者123 更新时间:2023-11-28 08:04:57 25 4
gpt4 key购买 nike

我正在开发一个 iOS 应用程序。

对于我的服务器 API 请求,我使用 Alamofire 包装器方法,除其他参数外,这些方法采用 @escaping 闭包——通常用于成功、失败和处理加载指示器。在我的 ViewControllers 子类中,闭包本身被声明为 lazy var。这种闭包的一个例子:

lazy var sendRequestSuccess = {() -> Void in
// do something here
}

我如何调用我的 API 包装器方法:

APIRequestHelper.sharedInstance.sendRequest(success: requestSuccess, progress: animateActivityIndicator, failure: requestFailure)
// APIRequestHelper is my class for all API requests

一般情况下,我的 API 方法如下所示:

func sendRequest(success: @escaping () -> Void, progress: @escaping (AnimationAction) -> Void, failure: @escaping (String?) -> Void)  {
// Alamofire request sending and response handling goes here
}

我的问题

当我在 Debug 配置中构建我的应用程序时,一切都会顺利构建和运行。但是,在 Release 配置中,我所有的 @escaping 闭包(到目前为止有 96 个)生成链接器错误,如下所示:

"__TFFC8<my app name>27AddressPickerViewControllerg23getPlaceLocationFailureFGSqSS_T_auL_4selfS0_", referenced from:
__TTSf4d___TFFC8<my app name>27AddressPickerViewControllerg23getPlaceLocationFailureFGSqSS_T_U_FGSqSS_T_ in AddressPickerViewController.o
"__TFFC8<my app name>26RequestsListViewControllerg22getRequestsListSuccessFGSqGSaCS_5Order__T_auL_4selfS0_", referenced from:
__TTSf4g___TFFC8<my app name>26RequestsListViewControllerg22getRequestsListSuccessFGSqGSaCS_5Order__T_U_FGSqGSaS1___T_ in RequestsListViewController.o
"__TFFC8<my app name>19LoginViewControllerg19getCountriesFailureFGSqSS_T_auL_4selfS0_", referenced from:
__TTSf4g___TFFC8<my app name>19LoginViewControllerg19getCountriesFailureFGSqSS_T_U_FGSqSS_T_ in LoginViewController.o

还有一些额外的信息:

ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我尝试过的

根据其他一些涉及链接器错误的 SO 问题,我确保在“build设置”>“链接”的“其他链接器标志”中有 $(inherited)。事实上,DebugRelease 配置的选项(列出的库)是相同的。我还尝试在“build设置”>“体系结构”中打开和关闭“仅构建事件体系结构”。然而,大多数此类问题都与各种第三方库有关,而在我的例子中,@escaping 闭包是语言本身的一部分,似乎会造成麻烦。

这是我开发人员职业生涯中第一个让我写下自己的 SO 问题的问题,在此先感谢。

最佳答案

我必须自己找到解决方案,所以我会把它写在这里,以防有人遇到同样的问题。

原来问题出在我的 @escaping 闭包语法中。我没有提供捕获列表,链接器有问题,可能是由于保留循环的可能性。此外,由于我将在闭包中使用 weak self,因此我现在必须对所有对 self 的调用使用可选链接。

所以我检查了所有的闭包并更改了它们的语法

lazy var someOperationSuccess = {(someStringParameter: String?, someIntParameter: Int?) -> Void in
print ("Success")
self.doSomething()
}

lazy var someOperationSuccess: (String?, Int?) -> Void = {[weak self] someStringParameter, someIntParameter in
print ("Success")
self?.doSomething()
}

关于ios - 转义闭包会导致 Release 配置中出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45456982/

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