0

我有一个链接在我的 iOS 应用程序中的 C++ 静态库。我有一个 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 *'

这很清楚..问题是我如何克服这个保留周期?任何指针?

4

2 回答 2

0

__weak修饰符仅适用于指向 Objective-C 对象的指针。您不能将它与 a 一起使用void*,但在这种情况下您不需要。只需将它从变量声明中删除,您的代码就应该可以工作(假设您在调用块之前不破坏库实例)。

于 2012-08-16T09:13:53.077 回答
0

您需要将所有对self块中的引用包装为弱引用。这包括访问任何 ivar

__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
      }];
    };
于 2012-08-16T09:20:30.590 回答