1

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

__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因此当我分配weakPicvc.pic它时,我为其分配了一个 nil 值。如果我weakPic用 just替换originalPic,那么它可以正常工作..(originalPic将具有更新的值)但是我得到了保留周期.. 想法?

4

2 回答 2

1

在不了解您的代码的情况下,我建议您考虑声明一个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
            }
        }

    }];
}

它可能不是你想要的weakSelf,而是其他一些对象。在这种情况下,只需声明其他对象为弱对象,只要您可以相对确定它的存在时间与按钮一样长或更长。

于 2013-09-16T15:27:14.753 回答
-1

您可能还想查看将其声明为 __block 变量。__block 关键字可防止在块内制作对象的副本。

有关 __weak 和 __block 引用的更好解释,请参阅线程。

于 2013-09-16T16:14:16.237 回答