Как разрешить сохранение цикла в блоке для 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
      }];
    };
Другие вопросы по тегам