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オブジェクトへのポインタにのみ適用されます。と一緒に使用することはできません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 に答える