2016-05-02 64 views
2

我目前是owncloud iOS library,用於Swift應用程序的上傳任務。 它用Objective-C編寫,並要求我將AutoreleasingUnsafeMutablePointer<NSProgress?>傳遞給upload method如何獲得Swift對象的AutoreleasingUnsafeMutablePointer

說我創建像這樣

let progress: NSProgress? = NSProgress() 

一個新對象我怎樣才能得到這個對象在斯威夫特的AutoreleasingUnsafeMutablePointer<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的依賴。請注意,您必須將dynamic關鍵字放在您要使用KVO觀察的對象前面。

如果仍然得到一個

EXC_BAD_ACCESS

例外,使用Singleton模式

2

AutoreleasingUnsafeMutablePointer只是一個結構。您所要做的就是創建指針,然後將該值分配給其屬性memory

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

不幸的是,當我嘗試你的代碼時,我仍然得到一個致命錯誤: 讓我們進步:NSProgress? = NSProgress(); var progressPointer = AutoreleasingUnsafeMutablePointer .init(); progressPointer。記憶=進步! 我必須將指針中的NSProgress類型更改爲「可選」,因爲庫需要此選項。 – slashburn