我正在开发一款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问题,我确保在构建设置&gt;中的“其他链接器标志”中有$(inherited)
。链接。实际上,Debug
和Release
配置的选项(列出的库)都相同。我还尝试在Build Settings&gt;中切换“Build Active Architecture Only”。建筑开关。
但是,大多数此类问题都与各种第三方库有关,而在我的情况下,@escaping
闭包(这是语言本身的一部分)似乎会造成麻烦。
这是我开发人员生涯中的第一个问题,导致我提前写了我自己的SO问题。
答案 0 :(得分:0)
我必须自己找到解决方案,所以我会在这里写一下,万一有人遇到同样的问题。
原来问题出在我的@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()
}