提供弱引用时,块参数是不是需要指定所有权限定符?
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++)