转义闭包会在Release配置

时间:2017-08-02 09:33:52

标签: ios swift linker closures

我正在开发一款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)。链接。实际上,DebugRelease配置的选项(列出的库)都相同。我还尝试在Build Settings&gt;中切换“Build Active Architecture Only”。建筑开关。 但是,大多数此类问题都与各种第三方库有关,而在我的情况下,@escaping闭包(这是语言本身的一部分)似乎会造成麻烦。

这是我开发人员生涯中的第一个问题,导致我提前写了我自己的SO问题。

1 个答案:

答案 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()
    }