2013-11-24 3 views
2

Я все еще относительно новичок в Objective C и легко смущен различными типами. Я использую код из образца SquareCam, который включен в более крупный проект. Он отлично работает, но теперь я хочу сохранить videoDataOutputQueue, который имеет тип dispatch_queue_t, чтобы я мог использовать его в другом месте проекта. Он должен пройти через некоторый код на C++, прежде чем, наконец, вернется в код Objective C. Поэтому я пытаюсь добавить его в структуру, которую у меня уже есть, как void * (void * videoDataOutputQueue;)Как назначить dispatch_queue_t переменной в структуре

Однако я не нашел подходящего способа для его назначения без получения ошибки выполнения EXC_BAD_ACCESS. Поскольку dispatch_queue_t является объектом C++, не могу ли я просто использовать его адрес?

declared in the interface for squarecamviewcontroller: 
    @interface SquareCamViewController : UIViewController <UIGestureRecognizerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate,UIActionSheetDelegate> 
{ 
    AVCaptureVideoPreviewLayer *previewLayer; 
    AVCaptureVideoDataOutput *dataOutput; 
    AVCaptureVideoDataOutput *videoDataOutput; 
    dispatch_queue_t videoDataOutputQueue; 
    <other stuff> 
} 

позже в коде:

- (void)setupAVCapture 
{ 
    <other stuff from the sample code> 
    MYSTRUCT myStruct = (MYSTRUCT)struct; // make a pointer to the structure 
    myStruct->videoDataOutputQueue = (void *)videoDataOutputQueue; <<<- bad access here at runtime 

<other stuff> 
} 

Очевидно, что это не правильный путь, и я не понимаю, что я делаю. У меня есть некоторые намеки с других сообщений, но я чего-то не хватает.

Спасибо, Кен

ответ

1

Вы сделали свой вопрос излишне трудно понять, потому что «код» вы представлены синтаксические ошибки. Это явно не ваш настоящий код, поэтому мы не можем догадаться, что на самом деле должно происходить. Например, вы используете зарезервированное ключевое слово struct, как будто это значение.

Учитывая, что вы говорите о плохом доступе, это не имеет никакого отношения к очереди отправки. Похоже, ваша переменная myStruct должна быть указателем на какую-то структуру, но это всего лишь указатель на мусор. Таким образом, попытка присвоить значение одному из своих полей заканчивается записью на неверный адрес памяти. На самом деле не имеет значения, какова природа поля.

Проблема, по-видимому, заключается именно в коде, который вы пропустили как «< другие материалы из кода примера>». Итак, вам нужно это показать. Действительно, вам нужно показать свой реальный код.

Помимо этого, dispatch_queue_t - тип C. Это не относится к Objective-C. Таким образом, вы можете использовать его на всех языках C. Нет необходимости использовать void*.

Очередь отправки, как и все объекты отправки, подсчитывается по ссылке. Если вы держите долгосрочную ссылку на нее, вам нужно убедиться, что она остается в живых. Таким образом, вам нужно сохранить его с помощью dispatch_retain(). Аналогично, вам нужно освободить его, когда вы закончите с ним, используя dispatch_release(). (Не забудьте выпустить старое значение, когда вы заменяете ссылку, которую вы держите с другим.)

+0

Прошу прощения, я бросил этот вопрос в спешке и действительно пошатнул код и не показал, где я держу объект для будущей ссылки и другие ошибки. Я ценю вашу помощь в любом случае. Я не понимал, что это тип C, который помогает. Завтра я собираюсь убрать это и повторю попытку. – user938797

+0

Если dispatch_queue_t - тип C, тогда я должен быть в состоянии добавить его в свою структуру, и все должно быть хорошо. . Но когда я пытаюсь что в моем файле .h я получаю «неизвестное имя типа„dispatch_queue_t“Если я создаю отдельные переменные этот типа, то это прекрасно ЬурейиХ структуры { BOOL debug_images;. BOOL debug_segments; и т.д. .... dispatch_queue_t videoqueue; << --- ошибка здесь } mystruct dispatch_queue_t othervideqoqueue; << --- это нормально Что мне не хватает? thanks, – user938797

+0

Вы пренебрегли включением нужного заголовка: '#include '. –