我试图更好地理解何时在内存相当密集的程序中正确释放对象。我目前的疑问来自以下代码:
- (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];
}
我本来以为程序现在已经用模型完成了,但是发布时就崩溃了。如果我不释放它,程序就会运行,但显然会出现内存泄漏。我做错了什么?
最佳答案
您的代码的问题是,当您第一次进入循环时,就会发生泄漏。
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];
}
}
关于iphone - 何时正确释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714662/