[英]weak variable with a strong reference in a block: does not create a retain cycle?
[英]How to keep a strong reference inside of a block without having a retain cycle
我在按钮上附加了一个块(使用此类别 ):
__unsafe_unretained typeof(UIImage) *weakPic = originalPic;
[button addEventHandler:^{
switch (state) {
case state1:
{
UIViewController *vc = //some VC
vc.pic = weakPic; // weakPic is nil at this point
// putting originalPic here would solve my problem
// but then I would have a retain cycle
}
case state2:
{
// other stuff
}
}
}];
与按钮相关联的动作因状态而异。
这里是问题:我必须保留上面的__unsafe_unretained
以避免保留周期。 但是,此代码在originalPic = nil
..的位置被调用,因此当我为vc.pic
分配weakPic
时,我为其分配了nil值。 如果我weakPic
用originalPic
替换了weakPic
,那么它可以正常工作..( originalPic
将具有更新的值),但是我得到了保留周期。
建议您在不了解代码的情况下考虑声明一个weakSelf并在self上实现访问器。
//the accessor
-(UIImage*)pic{
return originalPic;
}
-(void)someSetupMethod{
__weak id weakSelf = self;
[button addEventHandler:^{
switch (state) {
case state1:
{
UIViewController *vc = //some VC
vc.pic = [weakSelf pic]; // if weakself is nil at this point, then
// originalPic is likely invalid
}
case state2:
{
// other stuff
}
}
}];
}
它可能不是您想要的弱自我,而是其他一些对象。 在那种情况下,只要声明其他对象是弱的,就可以相对确定该对象的存在时间比按钮长或更长。
您可能还需要查看将其声明为__block变量。 __block关键字可防止在块内复制对象。
请参阅此线程,以更好地解释__weak和__block引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.