我有一个块附加到按钮(使用此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
将具有更新的值)但是我得到了保留周期...想法?
答案 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主题。