2016-03-25 24 views
0

は、私たちは私が方法を持っているとしましょう:完了ブロックがリークするのを待っていますか?

func getData(id:Int, completion: (object: object, error: Error?) ->()){ 

     // some code 

     let error = ErrorParser.parseData(data!) 

     if error?.statusCode <= 200 { 
      // do sth 
     } 
     else { 
      completion(object: object, error: error) 
     } 

    } 

} 

私の質問は、私は別のクラスからこのメソッドを呼び出したときに何が起こるか、で、完了ブロックは(呼び出し元のクラスはブロックが返されることはありません)と呼ばれることはありませんか?これは安全ですか?

答えて

1

// some codeでスキップした部分によって異なります。 あなたが非同期リクエストを実行しているいくつかのサードパーティ製のlibを使用している想像してみましょう:あなたは新しいクロージャを渡している。ここ

func getData(id:Int, completion: (object: object, error: Error?) ->()){ 
    MyLibrary.doRequest(id: id) { data in 
     let error = ErrorParser.parseData(data!) 
     if error?.statusCode <= 200 { 
      // do sth 
     } 
     else { 
      completion(object: object, error: error) 
     } 
    } 
} 

MyLibrary.doRequestメソッドのパラメータとして(のはそれB名前を付けてみましょう)。そしてcompletionパラメータはBクロージャによってキャプチャされ、このクロージャが解放されるまで解放されません。 次に、MyLibraryはBクロージャへの強い参照を格納し、はおそらくです。要求が完了(または失敗)してBクロージャが実行された後にBクロージャを解放します。あなたがここにいくつかの同期コードを持つことができます

はまた:この場合、

func getData(id:Int, completion: (object: object, error: Error?) ->()){ 
    let data = OtherLib.loadDataFromDisk(id) 
    let error = ErrorParser.parseData(data!) 
    if error?.statusCode <= 200 { 
     // do sth 
    } 
    else { 
     completion(object: object, error: error) 
    } 
} 

を、あなたの完了のブロックは、関数から戻った後にリリースされます。

関連する問題