[英]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.