0

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

ただし、これにより次のエラーメッセージが表示されます。

malloc:*オブジェクト0x12df1810のエラー:解放されるポインターが割り当てられませんでした

このポインタをコピーするときに割り当てているメモリをどのように処理する必要がありますか?

そして、これは親変数のディープコピーを含むディープコピーを生成していますか?私が得ているいくつかの例外は、不要なポインターがクリーンアップされているか、コードの他の領域で再割り当てされていることを示唆しています。

編集:deallocメソッドの例外を解決するために、.hファイルのプロパティを次のように変更しました。

@property (nonatomic, retain) ShortestPathStep *parent;
4

1 に答える 1

0

ここにいくつかの一般的な注意事項があります

とが親のプロパティ プロパティを保持していることを確認しposition、プロパティをコピー タイプにします。gScorehScore

@property (nonatomic, copy) Your_Parent parent;

init 関数を次のように更新します。

-(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 でのリリースが機能するはずです。

于 2012-06-24T11:29:38.970 に答える