1

我在视图中有一个属性,这样的数组数组:

@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;
}

然后我将初始化代码嵌入:

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

现在不再泄漏,谢谢!

4

2 回答 2

3

您的代码不能确保矩阵的每个设置都与一个拆解完全匹配。例如,viewDidUnload不保证被调用。此外,您无法防止重复设置或拆除。

如果您真的需要 C 数组数组,更好的方法是在视图(initWithFrame:initWithCoder:)的初始化程序中创建它并在其dealloc.

编辑:为了减轻您对dealloc和 ARC 的担忧:

您当然可以在 ARC 中覆盖 dealloc 并依赖它被调用。唯一的区别是您不能显式调用被覆盖的实现 ( [super dealloc])。ARC 将为您插入。

于 2012-09-06T19:29:29.853 回答
0

使用 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** 更快,内存效率更高。你的泄漏消失了。

于 2012-09-06T20:49:47.793 回答