如何解决void *中的保留周期?

时间:2012-08-16 09:01:35

标签: ios automatic-ref-counting retain-cycle

我有一个在我的iOS应用程序中链接的C ++静态库。我有一个无效*,以便从我的代码访问库提供的一些操作。问题是我已经在我的项目上激活了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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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
      }];
    };