EXC_BAD_ACCESS с использованием dispatch_async - PullRequest
2 голосов
/ 05 апреля 2011

Я пытаюсь выполнить блок через асинхронную очередь отправки в Objective-C ++. Вот фрагмент класса того, что я пытаюсь сделать ...

class Blah {
public:
    void dispatch(const EventPtr& event) {
        dispatch_queue_t queue = dispatch_queue_create(_queueName.c_str(), NULL);
        dispatch_async(queue, ^{
            this->dispatchEventToSubscribers(event); 
        });
        dispatch_release(queue);
    }
protected:
    Dude _dude;
    void dispatchEventToSubscribers(const EventPtr& event) {
        _dude.dispatchToSubscribers(event);
    }
}

Я получаю EXC_BAD_ACCESS в методе dispatchEventToSubscribeers. Когда я проверяю, что является значением _dude, XCode сообщает, что оно выходит за рамки. Я могу только предположить, что я как-то теряю this. Проверка документов на параллелизм:

Для блоков, которые вы планируете выполнить асинхронно с использованием очереди отправки, безопасно захватывать скалярные переменные из родительской функции или метода и использовать их в блоке. Тем не менее, вы не следует пытаться захватить большое структуры или другие указатели на основе переменные, которые выделяются и удалено контекстом вызова. Посредством время выполнения вашего блока память, на которую ссылается этот указатель, может уйти Конечно, это безопасно выделить память (или объект) себя и явно раздай владение этой памятью для блока.

Так как я могу асинхронно отправлять метод для this объекта?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 09 апреля 2011

По какой-то причине создание локального экземпляра event сработало ... Я не уверен, почему ... то есть ..

void dispatch(const EventPtr& event) {
    dispatch_queue_t queue = dispatch_queue_create(_queueName.c_str(), NULL);
    EventPtr eventPtr = event;  //local instance...
    dispatch_async(queue, ^{
        this->dispatchEventToSubscribers(eventPtr); 
    });
    dispatch_release(queue);
}
0 голосов
/ 07 апреля 2011

Вроде проблем нет.Убедитесь, что экземпляр Blah активен при выполнении блока.Блоки автоматически сохраняют экземпляры Objective-C.не для экземпляров C ++.

...