我试图更好地了解何时在相当内存密集的程序中正确释放对象。我目前的疑问来自下面的代码:
- (void)scrollViewDidScroll:(UIScrollView *)localScrollView
{
InteractionPointModel *model = [[InteractionPointModel alloc] init];
for (int x=0; x<totalInteractionPoints; x++) {
model = [interactionPointData objectAtIndex:x];
CGPoint oldCenter = model->worldLocation;
CGPoint newCenter;
newCenter.x = oldCenter.x * [localScrollView zoomScale];
newCenter.y = oldCenter.y * [localScrollView zoomScale];
[[interactionPoints objectAtIndex:x] setCenter:newCenter];
}
[model release];
}
我原本以为该程序现在已经完成了模型,但是在发布时崩溃了。如果我不释放它,程序运行,但显然有内存泄漏。我做错了什么?
答案 0 :(得分:4)
您的代码存在的问题是,当您第一次进入循环时,您正在泄漏。
InteractionPointModel *model = [[InteractionPointModel alloc] init];
上面一行是分配一个不会被使用的对象。
model = [interactionPointData objectAtIndex:x];
上面的行使model
指向不同的对象,因此,之前的值不再指向。
[model release];
发布时会发生崩溃,因为您发布的是您不拥有的值。当你发布时,如果你进入循环,至少一次,model
指向数组的最后一个对象interactionPointData
。
要修复代码,只需删除错误的内存管理。
- (void)scrollViewDidScroll:(UIScrollView *)localScrollView {
InteractionPointModel *model = nil;
for (int x=0; x<totalInteractionPoints; x++) {
model = [interactionPointData objectAtIndex:x];
CGPoint oldCenter = model->worldLocation;
CGPoint newCenter;
newCenter.x = oldCenter.x * [localScrollView zoomScale];
newCenter.y = oldCenter.y * [localScrollView zoomScale];
[[interactionPoints objectAtIndex:x] setCenter:newCenter];
}
}
答案 1 :(得分:2)
您似乎正在用InteractionPointModel
数组中的现有对象替换新分配的interactionPointData
对象。在方法结束时,在循环之后,你试图释放我怀疑是一个自动释放的对象(来自数组)正如你在评论中所说的那样,来自数组的一个对象你不拥有,导致崩溃。
如果不释放它,则泄漏是由您在开始时初始化的新分配对象引起的,因为您已将model
更改为指向数组中的对象,因此无法再访问该对象