我在解决一些相当可怕的内存泄漏时遇到了一些麻烦,当我运行我的 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;