在提供弱引用时,块参数是否需要指定所有权限定符?

时间:2013-06-17 09:58:15

标签: objective-c cocoa objective-c-blocks

我试图以一种方式使用块,我提供对保留块的对象的引用,如下所示:

typedef void(^RunBlock)(__weak Thing *block_owner, ThingFinishBlock finish);

其中Thing的属性run_block属于RunBlock类型。

Thing *thing = [Thing thingWithBlock^(Thing *owner, ThingFinishBlock finish) { ... }];

run_block内拨打Thing就是这样的:

__weak typeof(self) this = self;
_finish_block = ^(){ ... }
self.run_block(this, _finish_block);

所以我现在想知道的是,定义run_block的第一个参数Thing *owner而不用__weak作为前缀是否安全,或者这会导致保留循环吗?我不确定,因为指针在typedef中已经被定义为__weak,并且给定的参数已经是__weak

^(__weak Thing *owner ...){ ... }

相反
^(Thing *owner, ...) { ... }

谢谢!

1 个答案:

答案 0 :(得分:0)

不,参数中的__weak不是函数类型本身的一部分。

typedef void(^RunBlock)(__weak Thing *block_owner, ThingFinishBlock finish);

相同
typedef void(^RunBlock)(Thing *block_owner, ThingFinishBlock finish);

这是您实现参数中__weak重要的块的地方。

另外,我不知道为什么你认为这与保留周期有关。