Почему dispatch_queue_create выдает ошибку EXC_BAD_ACCESS в Swift?

Я портирую код с C ++ на Swift, который использовал Grand Central Dispatch, и обнаружил любопытную ошибку: dispatch_queue_create, по-видимому, вообще не работает.

Например, в заголовке базового класса C ++ я бы объявил

dispatch_queue_t m_WorkQ;

и в инициализаторе поместите

m_ResultQ = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0);

... и все было великолепно.


Я пробовал это в Swift в своем классе, объявив это на уровне класса:

var resultQueue: dispatch_queue_t

... и в инициализаторе у меня (среди прочего) есть строка

resultQueue = dispatch_queue_create("com.myapp.mHitsUpdateQueue", 0)

... и он компилируется и запускается нормально, но дает мне немедленную ошибку времени выполнения EXC_BAD_ACCESS (code = 1, address = 0x37) в приведенной выше строке

Чтобы определить, сделал ли я что-нибудь еще, я создал приложение-инструмент командной строки, состоящее только из следующего кода:

import Foundation

var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", 0)

println(thisQueue.description)

... и, конечно же, я получаю указанную выше ошибку прямо в строке назначения thisQueue. Так что я почти уверен, что в создании очередей Swift и GCD есть что-то действительно очевидное, чего мне не хватает.

Может ли кто-нибудь помочь мне здесь?


person Charles    schedule 04.03.2015    source источник


Ответы (1)


Второй аргумент dispatch_queue_create() имеет тип dispatch_queue_attr_t, который объявлен как

typealias dispatch_queue_attr_t = NSObject

Вы должны передать DISPATCH_QUEUE_SERIAL или nil для последовательной очереди (или DISPATCH_QUEUE_CONCURRENT для параллельной очереди):

var thisQueue = dispatch_queue_create("com.myApp.mHitsUpdateQueue", DISPATCH_QUEUE_SERIAL)

В C (++) вместо указателя NULL можно передать 0.

Однако компилятор Swift превращает целое число 0 в объект NSNumber, чтобы его можно было передать функции, ожидающей параметра NSObject. Это вызывает исключение времени выполнения, потому что NSNumber не является допустимым атрибутом. Таким образом, передача 0 или nil в Swift существенно отличается.

person Martin R    schedule 04.03.2015