2017-08-02 6 views
1

iOSアプリケーションを開発中です。閉鎖をエスケープすると、リリース設定でリンカエラーが発生する

私のサーバAPIリクエストでは、他のパラメータの中でも@escapingクロージャを使用するAlamofireラッパーメソッドを使用します。通常、成功、失敗、ローディングインジケータの処理に使用します。クロージャ自身は、ViewControllerサブクラスでlazy varと宣言されています。そのようなクロージャーの例:私は私のAPIのラッパーメソッドを呼び出す方法

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

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 
} 

私の問題

でアプリをビルドすると構成では、すべてがスムーズに構築されて実行されます。しかし、Release設定(これまでのところ、それらの96)私の@escapingクロージャのすべてにこのように見えるリンカエラーを生成します。私はを試してみました何

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

:カップルより多くの追加メッセージと

"__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 

リンカエラーを参照する他のいくつかの質問では、私は$(inherited)がビルド設定>リンクの「その他のリンカフラグ」にあることを確認しました。実際、オプション(ライブラリリスト)はDebugReleaseの構成で同じです。私はまた、ビルドの設定>アーキテクチャのオンとオフを切り替える "アクティブなアーキテクチャだけをビルド"しようとしました。 しかし、私のケースでは、言語自体の一部である@escapingクロージャが問題を引き起こすようだが、そのような質問の多くはさまざまなサードパーティのライブラリに関連している。

これは私の開発者のキャリアの最初の問題で、私自身のSOの質問をあまりにも先に書きました。

答えて

0

私は解決策を自分で見つけなければならなかったので、誰かが同じ問題を抱えた場合に備えてここに書きます。

私の@escapingクロージャの構文で問題が発生していました。私はキャプチャリストを提供しておらず、おそらくリテイサイクルの可能性のためにリンカに問題がありました。また、クロージャ内でweak selfを使用するので、selfへのすべてのコールにオプションのチェーンを使用する必要があります。

だから私はすべての私の閉鎖を経て、

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

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

からその構文を変更

関連する問題