Как разрешить сохранение цикла в блоке для void*?
У меня есть статическая библиотека C++, которая связана в моем приложении для iOS. У меня есть void* для доступа к некоторым действиям, предоставляемым библиотекой, из моего кода. Проблема в том, что я активировал ARC в своем проекте, и он кричит, что в блоке, где void* называется циклом сохранения, генерируется.
код, который генерирует предупреждение о сохранении цикла, выглядит следующим образом:
self.panGestureBlock = ^(UIGestureRecognizerState state, CGPoint point, CGPoint velocity) {
[strongStreamClient onWorkerThreadDoBlock:^{
LibGesture(libInstance, ATU_GESTURE_TYPE_PAN, GestureStateFromUIKitToLib(state), point.x, point.y, velocity.x, velocity.y);
}];
};
когда я передаю в качестве параметра указатель libInstance на функцию, он выдает следующее предупреждение:
Сильный захват "себя" в этом блоке может привести к сохранению цикла
если я попытаюсь сделать что-то вроде этого:
__weak void* weakLibInstance = libInstance;
self.panGestureBlock = ^(UIGestureRecognizerState state, CGPoint point, CGPoint velocity) {
[self onWorkerThreadDoBlock:^{
void* strongLibInstance = weakLibInstance;
LibGesture(strongLibInstance, ATU_GESTURE_TYPE_PAN, GestureStateFromUIKitToLib(state), point.x, point.y, velocity.x, velocity.y);
}];
};
это дает предупреждение как ниже:
'__weak' only applies to objective-c object or block pointer types; type here is 'void *'
что довольно ясно.. вопрос в том, как мне пройти этот цикл сохранения? какие-нибудь указатели?
2 ответа
__weak
Модификатор применяется только к указателям на объекты Objective-C. Вы не можете использовать его с void*
, но в этом случае вам не нужно. Просто удалите его из объявления переменной, и ваш код должен работать (при условии, что вы не уничтожаете экземпляр библиотеки перед вызовом блока).
Вам нужно обернуть все ссылки на self
в блоке по слабой ссылке. это включает доступ к любому ивару
__weak __block id blockSelf = self;
self.panGestureBlock = ^(UIGestureRecognizerState state, CGPoint point, CGPoint velocity) {
[strongStreamClient onWorkerThreadDoBlock:^{
LibGesture(blockSelf->libInstance, ATU_GESTURE_TYPE_PAN, GestureStateFromUIKitToLib(state), point.x, point.y, velocity.x, velocity.y);
//assume libInstance is an ivar
}];
};