【问题标题】:How to resolve retain cycle in block for void*?如何解决 void * 的块中保留循环?
【发布时间】:2012-08-16 09:01:34
【问题描述】:

我有一个链接在我的 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 *'

这很清楚.. 问题是我如何克服这个保留周期?有什么指点吗?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您需要将所有对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
            }];
          };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2012-07-26
        相关资源
        最近更新 更多