iPhone-dev: Min apps databas läcker minne som ett såll - vad göra?

Tråden skapades och har fått 7 svar. Det senaste inlägget skrevs .
1

Jag har äntligen fått tillbaka uppgift 3 från universitetet och ett stort problem är minnesläckor! Jag har lyckats stoppa alla utom en, så klart den som läcker mest!
Jag använder mig av sqlite för att lagra data och den allokerar en massa minne som jag sedan inte releaser men vart ska jag göra det?
Jag har (vad jag tycker) nagelfarit min kod men hittar ingen öppning som jag inte stänger.

Frågan om det är sqlite-klassen som läcker eller om det någon annan klass som använder sig av sqlite-klassen som står för läckandet.

Säg vad ni vill ha för att hjälpa mig så fixar jag det.

Hoppas så klart på arc och Ylan, men gärna någon annan utvecklare!

Som ett första praktiskt steg kan du starta programmet med Instruments. Välj Run with Performance Tool och sedan Leaks. Välj sedan när den upptäcker läckan att visa den utökade detaljvyn, där hittar du en stack trace från vilken du förhoppningsvis kan lista ut var någonstans minnet allokeras. Ett trick om ditt program inte är alltför krävande är att sänka samplingstiden från tio till en sekund så får du resultat lite oftare.

Ursprungligen av Mattias Hedman:

Jag använder mig av sqlite för att lagra data och den allokerar en massa minne som jag sedan inte releaser men vart ska jag göra det?

Release ska du göra (i värsta fall) när den instans som äger objektet (det som gör alloc, copy eller new) släpper referensen till det; alltså när det inte längre har en instansvariabel som perkar på det.

Så om jag förtår dig rätt så allokerar du minne för ett gäng objekt, sen gör du SQL-operationer för att skriva till databasen. I så fall borde du kunna göra release direkt efteråt.

Om inte annat ska du alltid ha release på samtliga objekt du äger i dealloc-metoden.

Ursprungligen av marcushedenstrom:

Release ska du göra (i värsta fall) när den instans som äger objektet (det som gör alloc, copy eller new) släpper referensen till det; alltså när det inte längre har en instansvariabel som perkar på det.

Så om jag förtår dig rätt så allokerar du minne för ett gäng objekt, sen gör du SQL-operationer för att skriva till databasen. I så fall borde du kunna göra release direkt efteråt.

Om inte annat ska du alltid ha release på samtliga objekt du äger i dealloc-metoden.

Det är inte fullt så enkelt med SQLite eftersom det är ett C-bibliotek med sin egen minneshantering. Det är därför viktigt att du anropar funktioner som t.ex. sqlite3_finalize() och sqlite3_close() där det behövs. Annars kommer SQLite att läcka minne, såvida du inte har en wrapper som redan gör det åt dig.

@Markus K: Det är precis så jag upptäckt att den läcker minne, utökad detaljvy ska jag titta efter.

@marcushedenstron: Jo det är lätt att göra relese om jag ser vilka objekt det är som jag ska göra det på... men det är just ett av problemen, jag kan inte se att några nu.

Så här ser det ut när jag kör Leaks:
http://gyazo.com/26f516c683752b0767c500e6195056e6.png

sqlite3_close använder jag i varje metod i där jag jobbar mot databasen, sqlite3_finalize använder jag inte på alla ställen utan bara... äh vänta så ska ni få koden för sql-klassen.
gist: 586811 - GitHub

Där har ni den.

Som Marcus K skriver; finalize måste du göra för varje statement.

Ja det har jag förstått men i min kod skapar jag bara ett statement och den kör jag finalize på.
Har jag missat någon statement?

1
Bevaka tråden