【发布时间】:2012-09-06 19:19:53
【问题描述】:
我在视图中有一个属性,这样的数组数组:
@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) {
...
}
现在不再泄漏,谢谢!
【问题讨论】:
-
您的代码看起来不错(除了分配
nil而不是NULL,机器人几乎是一回事)。您可以跳过循环内的赋值,因为数组即将被释放。你确定你的viewDidUnload被调用了吗? -
-viewDidUnload已弃用,您不应使用它。您需要将此代码移至您的-dealloc方法。此外,-viewDidUnload只有在视图完全被另一个视图控制器的视图遮挡时才会在某些内存压力情况下被调用。当视图控制器被简单地释放时,它不会被调用。虽然自动装箱很烦人,但使用 Foundation 集合而不是指针可能更容易。 -
我不能使用 dealloc,因为我正在使用 ARC 进行内存管理。谢谢
-
@JasonCoco
viewDidUnload可能会被弃用,如果未来的 iOS 版本仍处于 NDA 下将放弃视图卸载。 -
在 ARC 下使用
dealloc是完全有效且常见的。
标签: objective-c ios c memory-management memory-leaks