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

Posted

技术标签:

【中文标题】提供弱引用时,块参数是不是需要指定所有权限定符?【英文标题】:Does block parameters need to specify ownership qualifiers when providing weak references?提供弱引用时,块参数是否需要指定所有权限定符? 【发布时间】:2013-06-17 09:58:14 【问题描述】:

我正在尝试以提供对保留块的对象的引用的方式使用块,如下所示:

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

其中Thing 具有run_block 类型的属性RunBlock

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

Thing 中调用run_block 是这样的:

__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】:

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

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

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

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

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

【讨论】:

以上是关于提供弱引用时,块参数是不是需要指定所有权限定符?的主要内容,如果未能解决你的问题,请参考以下文章

当对象的引用作为参数时,可以直接打点访问该对象的私有成员(c++)

限定符注解

自动检测是否需要在函数参数中添加“const”限定符

冗余限定符有啥缺点吗?有啥好处吗?

VIsual Studio 2013 C++ 引用限定符问题

在哪些情况下我们需要在 ARC 下编写 __autoreleasing 所有权限定符?