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

时间:2013-09-16 15:12:53

标签: ios objective-c automatic-ref-counting objective-c-blocks retain

我有一个块附加到按钮(使用此category):

__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
        }
    }

}];

与按钮相关的操作因状态而异。

问题在于:我must保留上述__unsafe_unretained以避免保留周期。但是,此代码在originalPic = nil ..处被调用,因此当我将weakPic分配给vc.pic时,我将其分配为零值。如果我用weakPic替换originalPic,那么它工作正常..(originalPic将具有更新的值)但是我得到了保留周期...想法?

2 个答案:

答案 0 :(得分:1)

在不了解您的代码的情况下,我建议您考虑声明一个weakSelf并在自己上实现一个访问器。

//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
            }
        }

    }];
}

它可能不是你想要的弱者,而是其他一些对象。在这种情况下,只要声明其他对象是弱的,只要你可以相对确定它将存在比按钮长或长。

答案 1 :(得分:-1)

您可能还希望将其声明为__block变量。 __block关键字可防止在块内创建对象的副本。

有关__weak和__block引用的更好解释,请参阅this主题。