繁体   English   中英

如何在没有保留周期的情况下在块内保留强引用

[英]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值。 如果我weakPicoriginalPic替换了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM