Я все еще относительно новичок в 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>
}
Ясно, что это не правильный путь, и я не понимаю, что я делаю. У меня есть некоторые подсказки из других постов, но я что-то упускаю.
Спасибо,
кругозор
Вы сделали ваш вопрос излишне трудным для понимания, потому что представленный вами «код» содержит синтаксические ошибки. Это явно не ваш настоящий код, поэтому мы не можем догадаться, что на самом деле должно происходить. Например, вы используете struct
зарезервированное ключевое слово, как если бы оно было значением.
Учитывая, где вы говорите, что плохой доступ происходит, это не имеет никакого отношения к очереди отправки. Похоже, ваш myStruct
переменная должна быть указателем на какую-то структуру, но это просто указатель мусора. Таким образом, попытка присвоить значение одному из его полей приводит к записи в недействительный адрес памяти. Неважно, какова природа поля.
Проблема, по-видимому, именно в том коде, который вы пропустили как «<другие вещи из примера кода> «. Итак, вам нужно показать это. Действительно, вам нужно показать свой реальный код.
Сверх того, dispatch_queue_t
это тип C. Это не специфично для Objective-C. Таким образом, вы можете использовать его на всех языках Си. Там нет необходимости использовать void*
,
Очередь отправки, как и все объекты отправки, считается подсчитанной. Если вы сохраняете долгосрочную ссылку на него, вам нужно убедиться, что он остается в живых. Итак, вам нужно сохранить его с dispatch_retain()
, Кроме того, вы должны отпустить его, когда вы закончите с помощью dispatch_release()
, (Не забудьте освободить старое значение при замене ссылки, которую вы храните, другой.)
Других решений пока нет …