Как назначить dispatch_queue_t переменной в структуре
Я все еще относительно новичок в Objective C и легко запутался в различных типах. Я использую код из примера проекта SquareCam, включенного в более крупный проект. Это работает нормально, но теперь я хочу сохранить videoDataOutputQueue, который имеет тип dispatch_queue_t, чтобы я мог использовать его в другом месте в проекте. Он должен пройти через некоторый код C++, прежде чем снова оказаться в коде Objective C. Поэтому я пытаюсь добавить его в структуру, которая у меня уже есть, как void * (void *videoDataOutputQueue;)
Тем не менее, я не нашел правильный способ назначить его без получения ошибки времени выполнения 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. Таким образом, вы можете использовать его на всех языках на основе Си. Там нет необходимости использовать void*
,
Очередь отправки, как и все объекты отправки, считается подсчитанной. Если вы сохраняете долгосрочную ссылку на него, вы должны убедиться, что он остается в живых. Итак, вам нужно сохранить его с dispatch_retain()
, Кроме того, вам нужно отпустить его, когда вы закончите с помощью dispatch_release()
, (Не забудьте освободить старое значение при замене ссылки, которую вы держите, другой.)