何时正确释放对象

时间:2010-09-15 04:22:36

标签: iphone objective-c cocoa-touch

我试图更好地了解何时在相当内存密集的程序中正确释放对象。我目前的疑问来自下面的代码:

- (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];
}

我原本以为该程序现在已经完成了模型,但是在发布时崩溃了。如果我不释放它,程序运行,但显然有内存泄漏。我做错了什么?

2 个答案:

答案 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更改为指向数组中的对象,因此无法再访问该对象