[英]weak variable with a strong reference in a block: does not create a retain cycle?
[英]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值。 如果我weakPic
用originalPic
替換了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.