Speicher wird nicht wieder freigegeben - wie die Ursache finden?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicher wird nicht wieder freigegeben - wie die Ursache finden?

    Hallo,

    ich habe bei meiner App wegen bestimmter Navigations-Anforderungen eine flexible Navigation programmiert, bei der es im InterfaceBuilder viele separate ViewController gibt, von denen Einer beim Wechsel im InitialViewController als ChildViewController hinzugefügt wird.
    Beim Wechsel des ViewControllers wird anhand der Storyboard-ID ein neuer ViewController erzeugt, als ChildViewController zum InitialViewController hinzugefügt und der eigene (alte) ChildViewController vom InitialViewController entfernt. Der aktive ChildViewController ruft dazu beim Wechsel zu einem anderen ViewController über ein Delegate eine Methode im InitialViewController auf, die dann den neuen ChildViewController über den übergebenen Namen hinzugefügt und den alten ChildViewController direkt über den übergebenen Pointer entfernt. Beim Testen bzw. Navigieren habe ich nun bemerkt, dass der reservierte Speicher eines einmal aufgerufenen ChildViewControllers anscheinend nicht wieder freigegeben wird.

    Auf folgende Weise wird im InitialViewController vom Prinzip her ein neuer ViewController angezeigt, wobei der Aufruf mit Übergabe der Parameter wie gesagt aus dem zuletzt hinzugefügten ChildViewController heraus erfolgt:

    Quellcode

    1. - (void) wechselVonAltemVC:(UIViewController *)alterVC ZuVCName:(NSString *)neuerVCName
    2. {
    3. meinVC *neuerVC = [[self storyboard] instantiateViewControllerWithIdentifier:neuerVCName];
    4. [neuerVC setDelegate:self];
    5. [self addChildViewController:neuerVC];
    6. neuerVC.view.bounds = self.view.bounds;
    7. [self.view addSubview:neuerVC.view];
    8. [neuerVC didMoveToParentViewController:self];
    9. [alterVC willMoveToParentViewController:nil];
    10. [alterVC.view removeFromSuperview];
    11. [alterVC removeFromParentViewController];
    12. }
    Alles anzeigen

    In Instruments werden mir weder Leaks noch Zombies angezeigt, weswegen ich glaube, dass ich irgendwo Abandoned Memory oder etwas Ähnliches erzeuge. Der Speicherbedarf wächst nicht unendlich, sondern nur mit jedem zum ersten Mal aufgerufenen ViewController. Wenn ich jeden ViewController ein mal aufgerufen habe, benötigt die App aber insgesamt viel zu viel Speicher. Leider ist die Codebasis nicht so einfach zu durchschauen und ich komme mit Instruments nicht so richtig weiter - ich sehe zwar im Generation Snapshot, dass viele Grafiken mit identischer Größe den Speicher zumüllen, aber ich sehe da nur die Pointer und weiß so gar nicht, wo da jetzt genau das Problem liegt bzw. wie ich die Ursache für dieses Problem herausfinden kann?

    Von daher wäre es sehr nett, wenn mir jemand einen Tipp geben könnte, wie man mit Instruments oder von mir aus auch mit anderen Methoden der Ursache für dieses Problem auf die Spur kommen kann.

    Viele Grüße,
    PanMar
  • Schau dir mal im Memory-Instrument die Baumansicht für den Speicherverbrauch an, und klappe immer den Teil mit dem höchsten Speicherverbrauch auf. Außerdem lassen sich die Speicherblöcke, die das System reserviert hat, ausblenden. (Das kann aber muss nicht immer hilfreich sein.) Ich würde auch mal prüfen, wo die speicherfressenden Grafiken herkommen.

    Es gibt leider aber auch Speicher, den man nicht verkleinern kann.
    „Meine Komplikation hatte eine Komplikation.“