我有一个在我的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 *'
这很清楚..问题是我如何克服这个保留周期?任何指针?
答案 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
}];
};