2013-07-17 36 views
2

保留考慮下面的代碼週期釋放的解決方案

NSMutableArray *a = [NSMutableArray array]; 
    NSMutableArray *b = [NSMutableArray array]; 

    [a addObject:b]; 
    [b addObject:a]; 

是什麼使對象數組DEALLOCATE當我設置A和B NIL的選項?

我試過很少的東西(就像弱引用),但它似乎沒有工作..(可能是因爲我不夠了解 - 新的目標c)。

很想得到一些幫助。

謝謝

+1

你想做什麼?他們爲什麼都包含對方?似乎有點爲我設計。 –

+0

這是一個非常人爲的例子,但總的來說,我認爲弱代理是防止保留週期的一個很好的解決方案,特別是當你想在數組中存儲弱引用而不必一直解除它們(請參閱我的答案)。您還可以添加一些代碼來自動清理數組並刪除消失並因此自動歸零的項目。 – jhabbott

回答

0

它在這裏解釋:Non-retaining array for delegates

您可以使用

+ (NSValue *)valueWithNonretainedObject:(id)anObject 

而且把NSValue在數組中。

還是這樣認爲:

NSMutableArray* NICreateNonRetainingMutableArray(void) { 
    return (NSMutableArray *)CFArrayCreateMutable(nil, 0, nil); 
} 

NSMutableDictionary* NICreateNonRetainingMutableDictionary(void) { 
    return (NSMutableDictionary *)CFDictionaryCreateMutable(nil, 0, nil, nil); 
} 

NSMutableSet* NICreateNonRetainingMutableSet(void) { 
    return (NSMutableSet *)CFSetCreateMutable(nil, 0, nil); 
} 
+0

埃姆,這很明顯..我正在尋找一個不同的解決方案 – Rouki

+0

是的,我知道,我也很好奇 – MatLecu

+0

發現了一些技巧,編輯我的答案,希望它有幫助! – MatLecu

0

可以使整個數組不保留它的元素:CFArrayCreate()

這可能是有問題的ARC如果您不再使用的元素,然後通過數組迭代後來。

0

這種事情的一個解決方案是將您的對象包裝在弱代理對象中。下面是一個例子實現這樣的目標:

https://github.com/j-h-a/jalib-core/blob/master/JALibCore/Helpers/JAWeakProxy.h

https://github.com/j-h-a/jalib-core/blob/master/JALibCore/Helpers/JAWeakProxy.m

然後,你可以這樣做:

NSMutableArray* a = [NSMutableArray array]; 
NSMutableArray* b = [NSMutableArray array]; 
[a addObject:[JAWeakProxy weakProxyWithTarget:b]]; 
[b addObject:[JAWeakProxy weakProxyWithTarget:a]]; 

現在無論ab是弱的陣內引用。使用弱代理對象的好處在於,您不需要將其中的真實對象「拆箱」 - 您可以直接在弱代理對象上發送消息(調用方法),就好像它是target一樣,它會通過消息一起。例如:

[a[0] addObject:@(0)]; 

注意如何a[0]實際返回弱代理對象持有btarget,但我可以門坎直接發送addObject到代表b這種弱代理(這是一個NSMutableArray)和弱的實施代理將確保郵件被轉發到b

但是,您確實會丟失一些編譯時類型檢查,因此這種技術最適合用於幫助某些類的內部實現,這些類將具有良好類型的方法來訪問和枚舉內容。

當我使用這些東西時,我通常會將一些自動清理代碼放入數組枚舉器中。這是我隱藏在實用程序類中的數組,並提供基於塊的枚舉方法,我也保留一個toRemove數組。迭代時,我跳過target已自動調零的任何對象到nil並將它們添加到toRemove數組(弱代理對象仍然存在,即使它的target已消失),然後我遍歷toRemove數組並刪除代理對象。您還可以檢查target是否爲nil,並將其添加到toRemove陣列中的任何訪問器助手。

0

我不知道你怎麼想弱引用添加到一個數組,但如果是這樣的:

NSMutableArray *myArray = [NSMutableArray new] 
__weak id weakObject = blah; 
[myArray addObject:weakObject] 

然後就是weakObject聲明薄弱的事實沒有什麼區別。它只會使從棧中的對象的本地引用變弱。在你的情況下,數組需要持有對該對象的弱引用,並且NSMutableArray始終擁有對其成員的強引用。

有幾種方法可以做到這一點。 CFArray允許您指定它在創建時應如何保留其成員。或者你可以在NSValue中'引用'引用,雖然它保留在數組中,但不保留其內容。

如果您的目標是Mac或iOS 6.0+,最好的解決方案是使用弱NSPointerArray(使用[NSPointerArray weakObjectsPointerArray]創建)。

這比在正常的NSMutableArray中使用CFArray或NSValue要好,因爲當被分配的對象被釋放時,數組元素將被自動設置爲nil。