Geheugen Beheren van recursieve ouders - doelstelling C

Ik heb wat problemen met het oplossen van enkele nogal enge geheugenlekken die de Memory Leaks-hulpmiddelen me laten zien wanneer ik mijn iOS-applicatie gebruik.

Ik heb een pad-object met een bovenliggende variabele van dezelfde klasse en die bovenliggende heeft zijn eigen bovenliggende enzovoort.

Wat ik wil doen is een ander object een diep exemplaar van dit object geven, het kan dan doen wat het maar wil met die kopie en het mag geen invloed hebben op het origineel.

Ik denk dat het probleem ligt bij het maken van een kopie van mijn object zoals dat:

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

    return copy;
}

Dit roept mijn kopiebouwer aan:

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

    return self;
}

Ik heb ook geprobeerd om de ouder vrij te geven in de dealloc-methode, zoals zo:

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

    [super dealloc]; }

Dit geeft me echter de volgende foutmelding:

malloc: * fout voor object 0x12df1810: wijzer die wordt vrijgemaakt, is niet toegewezen

Hoe moet ik omgaan met het geheugen dat ik toewijs bij het kopiëren van deze aanwijzer?

En produceert dit een diepe kopie, inclusief een diepe kopie van de bovenliggende variabele? Sommige uitzonderingen die ik heb gekregen, suggereren dat verwijzingen die ik niet wil, worden opgeschoond of dat ze opnieuw worden toegewezen in andere delen van mijn code.

BEWERK: Om mijn uitzondering in de dealloc-methode op te lossen, heb ik de eigenschap in het .h-bestand gewijzigd in:

@property (nonatomic, retain) ShortestPathStep *parent;
0
waarom laat je dit geheugen normaal gesproken niet vrij bij dealloc? het lijkt erop dat ik je probleem niet krijg, probeer het alsjeblieft uit te leggen :)
toegevoegd de auteur Omar Abdelhafith, de bron
Ik heb toegevoegd wat er gebeurt als ik probeer het geheugen vrij te geven in de dealloc-methode, het geeft me een EXC_BAD_ACCESS-fout.
toegevoegd de auteur Demonofloom, de bron

1 antwoord

Hier zijn enkele algemene opmerkingen

Zorg ervoor dat positie , gScore en hScore eigenschappen van eigenschappen behouden voor ouder, maak de eigenschap van het type kopie

@property (nonatomic, copy) Your_Parent parent;

Update uw init-functie naar

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

nu zou de release in dealloc moeten werken.

0
toegevoegd
Dat liet me met dezelfde uitzondering, maar ik heb dat weten op te lossen door het eigendom vast te leggen. Ik denk dat dit mijn geheugenlekken moet oplossen.
toegevoegd de auteur Demonofloom, de bron