Ios 如何在没有保留循环的情况下将强引用保留在块内部
我在按钮上附加了一个块(使用此按钮): 与按钮关联的操作因状态而异Ios 如何在没有保留循环的情况下将强引用保留在块内部,ios,objective-c,automatic-ref-counting,objective-c-blocks,retain,Ios,Objective C,Automatic Ref Counting,Objective C Blocks,Retain,我在按钮上附加了一个块(使用此按钮): 与按钮关联的操作因状态而异 问题是:我将上述\uu不安全\u未保留,以避免保留周期。但是,在originalPic=nil处调用此代码。。因此,当我将weakPic赋值给vc.pic时,我给它赋值为零。如果我将weakPic替换为仅originalPic,则它可以正常工作。。(originalPic将有更新的值)但我会得到保留周期。。想法? < P>不知道更多关于你的代码,我建议你考虑声明一个弱自我,并在自己上实现一个访问器。 //the accessor
问题是:我将上述
\uu不安全\u未保留
,以避免保留周期。但是,在originalPic=nil
处调用此代码。。因此,当我将weakPic
赋值给vc.pic
时,我给它赋值为零。如果我将weakPic
替换为仅originalPic
,则它可以正常工作。。(originalPic
将有更新的值)但我会得到保留周期。。想法? < P>不知道更多关于你的代码,我建议你考虑声明一个弱自我,并在自己上实现一个访问器。
//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关键字可防止在块内创建对象的副本
请参阅thread,以更好地解释“弱”和“块”引用。是什么让您认为您有一个危险的保留周期?如果保证始终最终调用事件处理程序块,则您有一个“临时保留周期”,您可以忽略警告或使用编译器杂注抑制它。或者,如果originalPic是一个属性,那么您可以获得对
self
的弱引用,并在块内调用weakSelf.originalPic
,这就是我通常的做法。@MartinR您完全理解我的观点:)在ARC下,不再是\u块
指针不保留的情况:
//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
}
}
}];
}