• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

NSZombie

planetenring

Empire
Registriert
19.09.07
Beiträge
88
Hallo zusammen,

ich habe meine iPhone Applikation mit dem von Apple bereit gestellten "Instruments" auf Speicherlecks hin untersucht. Ergebnis: keine Lecks gefunden. Soweit so gut. Wenn ich jedoch bei Allocations auf den "i" Button drücke und dort die Option "enable NSZombie detection" aktiviere, werden gleich nach dem Start der Applikation über 1500 leaks angezeigt.

Daraufhin habe ich in Xcode über "new project" das Beispiel Template mit den Flipside Views erstellt und dieses der gleichen Untersuchung unterzogen. Das Ergebnis war ebenfall eine große Menge an Leaks.

Jetzt bezweifle ich, dass ein Apple Programmierer bei einem solchen Template fehler übersehen hat.

Kann sich das jemand erklären?

Danke im vorraus.
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Jetzt bezweifle ich, dass ein Apple Programmierer bei einem solchen Template fehler übersehen hat.
Da hat auch niemand etwas übersehen. Wenn man weiß, was diese Option bewirkt und wozu sie gedacht ist, dann weiß man auch, dass das kein Fehler, sondern so gewollt ist.

Vereinfacht gesagt, ist diese Option dazu da, um Speicherlecks zu erzeugen und zwar für Debugging Zwecke. Diese Option hilft Dir dabei, Probleme mit zu früh freigegebenen Objekten auf die Spur zu kommen. Näheres kannst Du hier nachlesen.

MacApple
 

planetenring

Empire
Registriert
19.09.07
Beiträge
88
Das hast du richtig erkannt :) ich Sachen Speichermanagement bin ich noch am Anfang. Deswegen ist es auch meine erste App *g* Aber erstmal Danke für die Antwort. Wenn ich das richtig verstanden habe kann ich mit dieser Funktion künstliche Speicherlecks erzeugen?!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Na ja, Speicherlecks künstlich erzeugen ist nicht der eigentliche Zweck der Übung. Wie in dem verlinkten Dokument beschrieben wird, dient die Option dazu, „over-released“ Objekte zu finden. Dazu werden halt die Objekte künstlich im Speicher gehalten, obwohl der Speicher normalerweise freigegeben werden würde. Dass dadurch ein Leak entsteht, ist halt die Nebenwirkung.

MacApple
 

planetenring

Empire
Registriert
19.09.07
Beiträge
88
Wenn ich das richtig verstehe sollte also wie bei der normalen "Leak Suche" auch bei der "NSZombie Option" keine Ausschläge bei Instruments auftauchen?!
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Wie sollen denn bei eingeschalteter „NSZombie Option“ keine Leaks auftauchen? Ein Zombie-Objekt verbleibt ja eben im Speicher, auch wenn niemand mehr da „einen Finger drauf hat“. Die „NSZombie Option“ hat auch nichts mit der Suche nach Speicherlecks zu tun. Ist Dir denn gar nicht aufgefallen, dass diese Option im Instrument „Allocations“ auftaucht und nicht im Instrument „Leaks“? Mit eingeschalteter „NSZombie Option“ nach Leaks zu suchen ist keine gute Idee.

Warum hast Du diese Option überhaupt eingeschaltet? Was wolltest Du damit bezwecken?

MacApple
 

planetenring

Empire
Registriert
19.09.07
Beiträge
88
Das war reines "Ausprobieren". Da in meinem Umfeld niemand mit Xcode oder ähnlichem arbeitet, bin ich gezwungen alles was mir unklar ist auszuprobieren und zu schauen was passiert. Und in den Fachbüchern über Xcode bzw. Cocoa wird nie genau auf Instruments eingegangen. Aber deine Erklärungen haben mir hier sehr geholfen. Wieder eine Wissenslücke geschlossen :)
 

Sebastato

Jonagold
Registriert
04.07.10
Beiträge
18
Zur Erklärung. NSZombie ist eine irre geniale Hilfe, wenn dein Programm sich einfach beendet mit BAD_ACCESS und ähnlichen Meldungen. Das passiert meist dann, wenn man ein Objekt overreleast, sprich man schickt einem Objekt ein release nachdem es bereits dealloziert wurde (release nach dealloc).

Oftmals passiert das auch, wenn man einem autoreleased Object ein release schickt. Dann knallt es irgendwo in der Nachrichtenschleife, im Callstack findet man dann auch oft ein NSAutoreleasePool-Pop. Ohne NSZombie hat man keine Ahnung, welches Object overreleast wurde und sucht sich einen Wolf.

Ist nun aber NSZombie eingeschaltet, werden Objecte nicht wirklich dealloziert, wenn sie die dealloc-Nachricht bekommen.
Overreleast man nun ein Object, bekommt man den Zombie angezeigt im Debugger und weiß sofort, welche Klasse und welche Instanz overreleast wurde. Da dieses eigentlich deallozierten Objekte als Zombies im Speicher verbleiben, registriert Leaks natürlich jede Menge Speicherlecks. Daher: Leaks nur bei ausgeschalteten Zombies suchen.
 

sashs

James Grieve
Registriert
23.03.10
Beiträge
133
Also das hätte ich mal vorher wissen müssen. :)
Ich kannte dieses Tool noch nicht, also dass man auf diese Weise testen kann. Ich hab schon öfter nach overreleased-Objekten suchen müssen. Und ich kann bestätigen, dass das ein sehr besch***** Arbeit ist.

Gruß

Sascha
 
Zuletzt bearbeitet: