2012-09-02 100 views
2

我不知道如何釋放一個Objective-C對象,我已經存儲在一個老式的c數組。 (注意:在經過大量搜索之後寫這篇文章時,我想我在測試代碼中發現了一個錯誤,所以這似乎是一個解決方案,而不是一個問題。那麼,我花了很多時間在它上面我會發布它......)發佈Objective-C對象與ARC數組C對象

我想將舊代碼轉換爲ARC,因爲我花費了太多的時間來調試內存管理相關的錯誤(抱歉---保留/釋放規則只是簡單的在我的脊椎上並沒有硬連線,並且我花了幾個小時才找到一個失蹤的保留,因爲這些錯誤在無關的時刻彈出,可能在記憶清理期間或之後)。

所以我有與c-風格數組一些現有的代碼(比如說的UILabel*的一個二維陣列),其中I可以愉快地calloc()指針和訪問它們通過一些array[col*colstride+row*rowstride],其中array是類型UILabel **的;我們假設UILabel*以隨機順序填充,所以我不能使用NSMutableArray

現在在ARC中,編譯器希望我使array的類型爲UILabel *__strong*,看起來(有些人會這樣寫爲__strong UILabel **)。

我不明白的是我該如何告訴ARC在需要時釋放UILabel對象(比如在使用c數組的對象的dealloc()中)。在試圖理解這個問題時,我有一小組對象MemoryMemoryUnit,前者試圖存儲後者的大c-陣列。

-(Memory*)init { 
    self = [super init]; 
    if (self) { 
    MemoryUnit * unit = [[MemoryUnit alloc] init]; 
    array = (__strong id *) calloc(sizeof(MemoryUnit*), 1024); 
    array[0] = unit; 
    } 
    return self; 
} 

-(void)dealloc { 
    for (int i=0; i<1024; i++) array[i]=nil; 
    free(array); 
} 

MemoryUnit我們有物體被存儲在C-陣列(因此這是MemoryUnit在上述UILabel的地方)英寸對於測試,我的代碼爲

-(void)dealloc { 
    NSLog(@"removed %x", (int)self); 
} 

在其dealloc()進行調試。

+2

您應該添加您的解決方案作爲答案,而不是將其附加到問題上。理解起來要容易得多,而且可以鏈接到答案。 –

回答

0

正如Bryan所說,我們需要一個堆棧溢出系統的答案。 所以我做的:

解決方案

顯然,MemoryUnit *__strong類型的數組元素設置爲nil導致對象被釋放,因爲如果這個元素已經在@propetty@synthesize語句對已申報。這在C-style array of pointers to Objective-C objects under ARC居然建議我覺得

(我發現XCode中非常簡潔的文檔,以及ARC的編譯器定義,只告訴我什麼是不允許的,而不是給如何正確做事情的提示。)