【问题标题】:Memory Managing recursive parents - Objective C内存管理递归父母 - Objective C
【发布时间】:2012-06-25 23:13:26
【问题描述】:

当我运行 iOS 应用程序时,我在解决 Memory Leaks 工具向我显示的一些相当可怕的内存泄漏时遇到了一些麻烦。

我有一个 Path 对象,它包含同一个类的父变量,并且该父变量包含它自己的父变量,依此类推。

我想要做的是给另一个对象一个该对象的深层副本,然后它可以对该副本做任何喜欢的事情,并且它应该对原始对象没有影响。

我认为问题出在我像这样复制我的对象时:

- (id) copyWithZone:(NSZone *)zone {
    ShortestPathStep *copy = [[[self class] allocWithZone:zone] initWithSteps:self];

    return copy;
}

这调用了我的复制构造函数:

-(id)initWithSteps:(ShortestPathStep*)copyFrom
{
    if ((self = [super init])) 
    {
        position = copyFrom.position;
        gScore = copyFrom.gScore;
        hScore = copyFrom.hScore;
        parent = [copyFrom.parent copy];
    }

    return self;
}

我也尝试过在 dealloc 方法中释放父级,如下所示:

-(void)dealloc {
    if(parent != nil)
        [parent release];

    [super dealloc]; }

但是这给了我以下错误信息:

malloc: * 对象 0x12df1810 错误:未分配指针被释放

我应该如何处理我在复制这个指针时分配的内存?

这是否会产生深层副本,包括父变量的深层副本?我得到的一些异常表明要么我不想要的指针被清理了,要么它们在我的代码的其他区域被重新分配。

编辑: 为了解决 dealloc 方法中的异常,我将 .h 文件中的属性更改为:

@property (nonatomic, retain) ShortestPathStep *parent;

【问题讨论】:

  • 为什么你通常不在dealloc时释放这个内存?似乎我没有得到您的问题,请尝试解释:)
  • 我添加了当我尝试在 dealloc 方法中释放内存时发生的情况,它给了我一个 EXC_BAD_ACCESS 错误。

标签: iphone ios ipad memory-management memory-leaks


【解决方案1】:

以下是一些一般性说明

确保positiongScorehScore 是保留属性属性 对于父级,将属性设为副本类型

@property (nonatomic, copy) Your_Parent parent;

将你的初始化函数更新为

-(id)initWithSteps:(ShortestPathStep*)copyFrom
{
    if ((self = [super init])) 
    {
        self.position = copyFrom.position;
        self.gScore = copyFrom.gScore;
        self.hScore = copyFrom.hScore;
        self.parent = copyFrom.parent;
    }

    return self;
}

现在 dealloc 中的发布应该可以工作了。

【讨论】:

  • 这给我留下了同样的例外,但我设法通过将属性设置为保留来解决这个问题。我认为这应该可以解决我的内存泄漏问题。
猜你喜欢
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多