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

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

__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的时候被调用..所以当我将weakPic分配给weakPic ,我给它分配了一个nil值。 如果我用weakPic替换weakPic ,那么它工作正常..( originalPic将具有更新的值)但是然后我得到保留周期..想法?

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

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

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

有关__weak和__block引用的更好说明,请参阅此主题。