2014-01-22 67 views
1

我有一個集合保持其對象的弱引用。我希望它符合NSFastEnumeration,但countByEnumeratingWithState:objects:count:提供的緩衝區使用unsafe_unretained引用。這會產生一個間隙,在此期間返回的參考可能會失效,但不是歸零。在一般情況下這很好 - 如果集合將其(當前有效但弱引用的)對象填充到緩衝區並返回,那麼調用者可能會根據需要創建自己的強引用。但是,這留下了兩個問題:使用弱引用時可以實現NSFastEnumeration嗎?

(1)我看不到任何保證for(){}迭代構造本身會創建對該對象的臨時強引用,因此如果{x}塊的內容更改集合外的某些內容以某種方式導致對象被釋放,然後它將有一個懸而未決的參考。

(2)從countByEnumeratingWithState:返回時仍然有一個小的差距,在此期間另一個線程上的活動可能使參考無效。我的集合並不是線程安全的,但如果它至少可以安全地存儲對其他線程可以引用的對象的引用,那將是非常好的,因爲在任何多線程應用程序中確實沒有辦法阻止它。

回答

1

你不能直接返回一個強大的引用給調用者。調用者不會釋放它,並且快速枚舉協議並不保證當調用者完成時您將有機會自行釋放它。

相反,您可以在將對象存儲到緩衝區之前保留+ autorelease對象。這將保證對象在呼叫者使用它們時保持活動狀態。它可能會傷害快速枚舉的「快速」部分,但您仍然可以獲得「方便的語法」部分。如果在讀取弱變量之後添加一個零檢查,則可以避免將nil指針存儲到緩衝區中。

+1

這可以工作,我想。你有沒有一種方法讓運行時生成一個有保證的保留+自動釋放的方法(也就是說,某種程度上,編譯器在某些時候不能/不會將其優化)? –