内存管理递归父级 - 目标C

时间:2012-06-24 10:43:56

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

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

我有一个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]; }

然而,这给了我以下错误消息:

对象0x12df1810的

malloc: * 错误:未释放指针被释放

复制此指针时,如何处理我分配的内存?

这会产生一个深层副本,包括父变量的深层副本吗?我得到的一些例外情况建议我不想要的指针被清理,或者在我的代码的其他区域重新分配它们。

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

@property (nonatomic, retain) ShortestPathStep *parent;

1 个答案:

答案 0 :(得分:0)

以下是一些一般性说明

确保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的发布应该可行。