簡體   English   中英

如何在沒有保留周期的情況下在塊內保留強引用

[英]How to keep a strong reference inside of a block without having a retain cycle

我在按鈕上附加了一個塊(使用此類別 ):

__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 ..的位置被調用,因此當我為vc.pic分配weakPic時,我為其分配了nil值。 如果我weakPicoriginalPic替換了weakPic ,那么它可以正常工作..( originalPic將具有更新的值),但是我得到了保留周期。

建議您在不了解代碼的情況下考慮聲明一個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
            }
        }

    }];
}

它可能不是您想要的弱自我,而是其他一些對象。 在那種情況下,只要聲明其他對象是弱的,就可以相對確定該對象的存在時間比按鈕長或更長。

您可能還需要查看將其聲明為__block變量。 __block關鍵字可防止在塊內復制對象。

請參閱線程,以更好地解釋__weak和__block引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM