2016-05-02 4 views
2

私はSwiftアプリケーションのアップロードタスクのために現在owncloud iOS libraryです。 Objective-Cで書かれており、にAutoreleasingUnsafeMutablePointer<NSProgress?>を渡す必要があります。スウィフトオブジェクトのAutoreleasingUnsafeMutablePointerを取得する方法

は私がスウィフトに、このオブジェクトのAutoreleasingUnsafeMutablePointer<NSProgress?>を取得できますので、

let progress: NSProgress? = NSProgress() 

のように新しいオブジェクトを作成すると言いますか?コードを実行するとき

var progress: NSProgress? = NSProgress() 
let unsafeAutoreleasingProgressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress) 

しかし、私は

EXC_BAD_ACCESS(コード= 1、アドレス= 0x15942320)を取得:

私はそれは次のように試してみました。アップロードの進捗状況を%で示すオブザーバーコールバックを追加したいので、進捗オブジェクトへの参照を保持したいと思います(例のリンクでも実証されています)。

答えて

2

実際には2つの問題がありました。

は、我々はそうのようなAutoreleasingUnsafeMutablePointer<NSProgress?>オブジェクトを作成することができます

let progress = NSProgress() 
let progressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress) 

それはあなたの周りのポインタを保持する必要があることに注意することが重要です。メソッド内にポインタを作成すると、メソッドスコープを終了するとすぐに参照が失われます。これは

EXC_BAD_ACCESS

例外が発生します。だからあなたの実装は次のようになります。

class MyClass: NSObject { 
    dynamic var progress: NSProgress = NSProgress() 
    var progressPointer: AutoreleasingUnsafeMutablePointer<NSProgress?> = nil 

    override init(){ 
     //... 
     //init non optional variables here 
     super.init() 
     progressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress) 
    } 
} 

私の場合は、サードパーティのObjective Cの依存関係を使用していたので、私はを観察キー値をしました。 KVOを使用して観察したいオブジェクトの前にdynamicキーワードを置く必要があることに注意してください。

あなたはまだシングルトンパターンを使用し、

EXC_BAD_ACCESS

例外を取得した場合。

2

AutoreleasingUnsafeMutablePointerは単なる構造体です。ポインタを作成し、その値をmemoryプロパティに代入するだけです。

var pointer = AutoreleasingUnsafeMutablePointer<NSProgress>.init() 
pointer.memory = progress! 
+0

残念ながら、私はあなたのコードを試しても致命的なエラーが表示されます: 進捗状況:NSProgress? = NSProgress(); var progressPointer = AutoreleasingUnsafeMutablePointer .init(); progressPointer。メモリ=進行! ライブラリで必要とするため、ポインタのNSProgressタイプをOptionalに変更する必要がありました。 – slashburn

関連する問題