簡體   English   中英

Objective-C malloc與c數組的數組

[英]Objective-C malloc with c array of array

我在視圖中有屬性,像這樣的數組數組:

@interface MyView : UIView

@property (nonatomic) CGPoint **matrix;

@end

在擁有此視圖的控制器中,我已在-viewDidLoad中加載數據,並在-viewDidUnload中釋放內存,如下所示:

- (void)viewDidLoad
{

    self.myView.matrix = malloc(sizeof(CGPoint*) * array1Size);
    for (int k = 0; k < array1Size; k++) {
        self.myView.matrix[k] = malloc(sizeof(CGPoint) * innerArraySize);
    }
}

- (void)viewDidUnload
{
    for (int k = 0; k < array1Size; k++) {
        free(self.myView.matrix[k]);
        self.myView.matrix[k] = nil;
    }
    free(self.myView.matrix);
    self.myView.matrix = nil;
    [self setMyView:nil];
    [super viewDidUnload];
}

在剖析的同時,我看到了泄漏。 有人可以在我錯的地方幫助我嗎?

謝謝

更新

我嘗試從viewDidUnload中刪除免費代碼並使用dealloc,如下所示:

-(void)dealloc {
    [self freeArray];
}

- (void) freeArray {

    for (int k = 0; k < 5; k++) {
        free(self.myView.matrix[k]);
        self.myView.matrix[k] = NULL;
    }

    free(self.myView.matrix);
    self.myView.matrix = NULL;
}

然后我將init代碼嵌入:

if (self.graphView.matrix == NULL) {
    ...
}

現在沒有更多的泄漏,謝謝!

您的代碼無法確保矩陣的每個設置都只有一個拆除匹配。 例如,不保證調用viewDidUnload 此外,您沒有防止重復設置或拆除。

如果你真的需要C數組的數組,更好的方法是在視圖的初始化器( initWithFrame:initWithCoder:創建它並在其dealloc刪除它。

編輯:為了減輕您對dealloc和ARC的擔憂:

你當然可以覆蓋ARC中的dealloc並依賴它被調用。 唯一的區別是你不能顯式調用重寫的實現( [super dealloc] )。 ARC將為您插入。

使用CGPoint數組:

@property (nonatomic) CGPoint *matrix;

.... init ...
{
   ...
   matrix = (CGPoint*) malloc(arraySize * sizeof(CGPoint));
 ...
}

- (void) dealloc
{
    free(matrix);
}

然后你只需在數組中直接設置/獲取CGPoint結構:

CGPoint someCGPoint = {0,0};
matrix[i] = someCGPoint;

someCGPoint = matrix[i];

這比CGPoint **更快,內存效率更高。 你的泄漏消失了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM