iphone - 何时正确释放对象

标签 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];
}

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

最佳答案

您的代码的问题是,当您第一次进入循环时,就会发生泄漏。

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/

相关文章:

ios - 如何在 iOS 中使用 MPMoviePlayerController 播放视频流

ios - 将数据从 UIViewController 发送到 UIView?

ios - UIWebView 在底部被 UITabBarController 截断

ios - 如何在 Objective C 中编写以下代码?

ios - CNContactViewController 无法调用或发送消息(使用 Peek 和 Pop 或 UIViewControllerPreviewingDelegate 显示)

iPhone : How to manage 130 images in ImageView?

iOS 创建具有动态内容的 PDF

iphone - 如何在 iOS 中向左或向右滑动以推送或弹出 ViewController

ios - 具有自定义委托(delegate)或数据源的 View Controller 的状态保存

ios - iPad上的UIDocumentInteractionController PopOver