Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在没有保留循环的情况下将强引用保留在块内部_Ios_Objective C_Automatic Ref Counting_Objective C Blocks_Retain - Fatal编程技术网

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

    }];
}