2017-09-14 7 views
-1

私はObjective Cと相互運用するSwiftコードをいくつか持っていますが、私は漏れていることに気づきました。問題を再現する純粋なスウィフトスニペット:NSMutableArrayにSwift Closureオブジェクトを追加しても機能しない - LEAK

let myClosure : ((String?) ->())! = { (fileName: String?) in 
} 

let arr = NSMutableArray() 
arr.add(myClosure) 
arr.remove(myClosure) 

これには誰が遭遇しましたか?どうすればそれを動作させることができますか?

+2

閉鎖が等しいかどうかを比較することはできませんので、私は仕事ができない:https://stackoverflow.com/questions/24111984/how-do-you-test-functions-and-closures-for-equality。 - そのQ&Aには、ハンドラクラスでクロージャをラップするなどの回避策も考えられます。 –

+0

ありがとうございました、提案したことを考え、APIを次のように変更しました。配列にクロージャを追加するメソッドはインデックスを返し、配列から削除するメソッドは前のメソッドから返されたインデックスを使用します。 –

答えて

-1

は、私たちのコードベースは自明純粋スウィフトを行くために、そのことはできません私の場合には、それゆえ、にObjCでinteropsスウィフトを使用して、再度強調するために。

私は、辞書からの閉鎖の除去のために使用されて閉鎖し、その整数に扱うNSUIntegerからマップするNSDictionaryのを使用するために私たちのAPIを変更。

このAPIの目的は、リスナーのコールバックを登録し、それらを登録解除する機能を持つことです。したがってNSUIntegerハンドルは削除ビットを満たします。

1

配列がこの配列から削除されません理由ですあなたの閉鎖物を除去するために比較することはできないので、閉鎖は参照を持っていません。

あなたのコード

let arr1 = NSMutableArray() 
arr1.add(myClosure)  
print(arr1)   //("(Function)") 
arr1.remove(myClosure) 
print(arr1)   //("(Function)") 

ソリューション

var arr = Array<Any>() 
arr.append(myClosure) 
print(arr)   //[(Function)] 
arr.remove(at: 0) 
print(arr)   //[] 

あなたも、私はあなたをお勧めします代わりに閉鎖インスタンスの要素を除去するためのインデックスを使用する必要がありますのでこれがインデックスによって削除されますスイフトで純粋なクラスを使用する。

+0

提案していただきありがとうございますが、このソリューションはこの場合には適していません。既存のObjC interopが削除できないという制約があります。 –

+0

あなたは公式な文書をお持ちですか? –

+0

それは私が –

関連する問題