2012-08-13 48 views
1

如何實現一個對象,該對象引用了一系列非保留的對象?擁有一個未保存的id對象列表?

我想要的東西類似UIControl/NSControl有:addTarget:(id)target action:(SEL)action ...;(在我的情況下,雖然我不需要UIControlEvents部分)。我想要使​​用這個目標/動作模式(並且最好遠離委託模式),但爲此我需要確保添加到對象的目標不會保留或保留循環。

我想執行使用malloc/free以確保目標不會保留將是一個解決我自己的數組,但是這一切麻煩聞起來像已經存在的地方實施的解決方案。在那兒?

+1

'malloc'?你可以簡單地使用'std :: vector'或者'std :: list',或者... – jweyrich 2012-08-13 05:52:20

回答

4

在OS X上,你可以創建一個NSPointerArray,將保持其對象的弱引用與+[NSPointerArray weakObjectsPointerArray],或者(如果你想要一本字典)的NSMapTable,它允許一個或兩個鍵和值的要弱舉行。

這些都不是iOS上可用的,但Core Foundation是。在OS X或iOS上,您可以使用CFArrayCFDictionary,傳遞NULL作爲回調,以使集合不對其包含的對象進行內存管理。要警告的是,如果您嘗試將這些作爲免費橋接可可對應物來使用,則該集合將不會尊重您的非保留/不復制願望。你將不得不使用CF函數來與它們進行交互(或者掀起一個包裝類)。

您也可以使用valueWithNonretainedObject:將您的物品包裝在NSValue中,並將其放入可可收藏夾(NSDictionary/NSarray)。該集合將擁有該值,但該值不會擁有它的對象。

+0

我會給出更多的分數,但是隻允許在▲中單擊一次。這工作非常好! – nacho4d 2012-08-13 06:21:22

+0

你使用了哪個選項? – 2012-08-14 05:02:45

+0

因爲我在iOS中''NSPointerArray'被丟棄了(我猜這是一個還沒有移植到iOS的類)。我也想到了'CFArray',但是正如你指出免費橋接呼叫可能會變得有點麻煩,所以我使用了'[NSValue valueWithNonretainedObject:]'它就像一個魅力:) – nacho4d 2012-08-14 06:44:12

1

您可以創建一個CFArrayRef,指定(如果你感覺很懶惰或回調只是0)不執行引用計數操作回調:

CFAllocatorRef allocator = 0; 
const void **values = ...; 
CFIndex numValues = ...; 
const CFArrayCallBacks* const callBacks = 0; 

CFArrayRef arr = CFArrayCreate(allocator, values, numValues, callBacks); 
相關問題