2016-05-02 8 views
2

Я в настоящее время owncloud iOS library для задачи загрузки моего приложения Swift. Написано в Objective-C и требует от меня пройти AutoreleasingUnsafeMutablePointer<NSProgress?> до upload method.Как получить AutoreleasingUnsafeMutablePointer объекта Swift

Say создать новый объект, как так

let progress: NSProgress? = NSProgress() 

Как я могу получить AutoreleasingUnsafeMutablePointer<NSProgress?> этого объекта в Swift?

Я попытался это следующим образом:

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) 
    } 
} 

В моем случае я сделал Key-Value Наблюдения, потому что я использовал третьей стороной Цель C зависимость. Обратите внимание, что перед ключевым объектом, которое вы хотите наблюдать, с помощью KVO, нужно поместить ключевое слово dynamic.

Если вы все еще получаете

EXC_BAD_ACCESS

исключение, используйте Singleton шаблон.

2

AutoreleasingUnsafeMutablePointer - всего лишь структура. Все, что вам нужно сделать, это создать указатель, а затем присвоить значение его memory.

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

К сожалению, я по-прежнему получаю фатальную ошибку при попытке вашего кода: Прогресс: NSProgress? = NSProgress(); var progressPointer = AutoreleasingUnsafeMutablePointer .init(); progressPointer.memory = progress !; Мне пришлось изменить тип NSProgress в указателе на Необязательный, потому что библиотека требует этого. – slashburn

 Смежные вопросы

  • Нет связанных вопросов^_^