UINavigationController nicht aus dem Speicher löschbar in ARC?!

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

  • UINavigationController nicht aus dem Speicher löschbar in ARC?!

    Hallo,

    ich habe mal einen kleinen Test gemach... ich habe ein NSMutableArray als Instanzvariable in meinem UIViewController deklariert. und einen Button mit Handler hinzugefügt der beim drücken das Array mit new initialisiert.

    Anschließend habe ich eine Schleife gebaut die mir 10 UINavigationController erstellt und zum Array hinzufügt.

    wenn ich jetzt im Instruments schaue existieren 10 Controller im Speicher wenn ich den Button erneut drücke sind es 20 obwohl das Array neu initialisiert wird.

    Deklariert ist das Array nicht als Property sondern im Interface der Header File -> NSMutableArray *_array;

    _array = [NSMutableArray new];
    for (int i=0; i<10; i++) {
    [_array addObject:[UINavigationController new]];
    }

    Warum gehen die NavigationController nicht aus den Speicher?
  • Ich schliesse mich der Frage an: Auch ohne ARC hatte ich genau den gleichen Effekt, bei dem mit Freigeben des NSMutableArrays die enthaltenen Objekte weiterhin allokiert blieben. Meine persönliche Vermutung: Der Reference-Counter dieser Objekte dürfte (mindestens) zwei sein, einmal vom Erzeugen des Objektes, einmal erhöht durch das Hinzufügen zum Array. Mit Freigeben des Arrays erhält nun jedes Objekt ein Release geschickt (meine ich mal in der Doku gelesen zuhaben, finde es aber in der neuen nicht mehr). Damit bleibt jedes Objekte aber mit einen Reference-Counter von eins weiterhin im Speicher.

    Ist es also nötig, die Elemente eines NSMutableArrays vor einem Release des Arrays manuell zu entfernen? Oder habe ich irgendwo einen Denkfehler?

    Ciao, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Thallius schrieb:

    Man kann bei Instruments doch auch den retaincount der objektecsehen oder nicht?

    Stimmt, den Hinweis im OP habe ich überlesen. Allerdings ist auch wichtig, welche Angaben reagtime und MyMattes zu ihrer Vermutung bewegten.

    MyMattes schrieb:

    Ist es also nötig, die Elemente eines NSMutableArrays vor einem Release des Arrays manuell zu entfernen?

    Nein, niemals und auf keinen Fall. ;)

    MyMattes schrieb:

    Oder habe ich irgendwo einen Denkfehler?

    Definitiv
    „Meine Komplikation hatte eine Komplikation.“
  • raegtime schrieb:

    Deklariert ist das Array nicht als Property sondern im Interface der Header File -> NSMutableArray *_array;

    Wie ist denn das definierte Standardverhalten von ARC bei der Zuweisung einer Instanzvariable ohne deklarierte Property?
    AFAIK ist es assign.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    raegtime schrieb:

    Deklariert ist das Array nicht als Property sondern im Interface der Header File -> NSMutableArray *_array;

    Wie ist denn das definierte Standardverhalten von ARC bei der Zuweisung einer Instanzvariable ohne deklarierte Property?
    AFAIK ist es assign.

    Nein, es ist strong.

    Transitioning to ARC Release Notes, Abschnitt: Variable Qualifiers schrieb:

    __strong is the default. An object remains “alive” as long as there is a strong pointer to it.
  • macmoonshine schrieb:

    Wie habt ihr die Freigabe der Controller gemessen?


    Mit Intruments ... da sehe ich ja welche Objekte allozoiert werden ... und auch live ob sie wieder verschwinden. Pushe ich z.B. einen ViewController ist er nach dem Poppen wieder aus dem Speicher verschwunden.


    Michael schrieb:

    Marco Feltmann schrieb:

    raegtime schrieb:

    Deklariert ist das Array nicht als Property sondern im Interface der Header File -> NSMutableArray *_array;

    Wie ist denn das definierte Standardverhalten von ARC bei der Zuweisung einer Instanzvariable ohne deklarierte Property?
    AFAIK ist es assign.

    Nein, es ist strong.

    Transitioning to ARC Release Notes, Abschnitt: Variable Qualifiers schrieb:

    __strong is the default. An object remains “alive” as long as there is a strong pointer to it.


    Richtig... daher meine Annahme, dass der NavigationController sich selbst beim Initialisieren irgendwohin referenziert so das er nie aus dem Speicher geräumt wird?! Auch wenn er nicht mehr im Array liegt?
  • macmoonshine schrieb:

    MyMattes schrieb:

    Ist es also nötig, die Elemente eines NSMutableArrays vor einem Release des Arrays manuell zu entfernen?

    Nein, niemals und auf keinen Fall. ;)

    Dann nochmal ganz dumm nachgefragt: Bekommen alle Elemente eines NSArrays den Retain-Counter um 1 dekrementiert, wenn das Array released wird?

    Bisher sah bei mir das Hinzufügen von Elementen (ohne ARC) prinzipiell wie folgt aus:

    Quellcode

    1. MyElement *element = [[MyElement alloc] init]:
    2. [array addObject:element];
    3. [element release];


    Damit dürften nach meinem Verständnis alle Elemente einen RetainCount von 1 haben und sollten (wenn die o. g. Annahme stimmt), nach einem "[array release]" verschwinden, stimmt's?

    Mattes (der dann noch irgendwo anders einen Bock geschossen hat)
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Dann nochmal ganz dumm nachgefragt: Bekommen alle Elemente eines NSArrays den Retain-Counter um 1 dekrementiert, wenn das Array released wird?

    Ein NSArray hält eine starke Referenz auf seine Elemente: Es sendet also retain beim Einfügen und release beim entfernen. Das steht an mehreren Stellen auch implizit(!) in der Doku zu NSArray.

    MyMattes schrieb:

    Damit dürften nach meinem Verständnis alle Elemente einen RetainCount von 1 haben und sollten (wenn die o. g. Annahme stimmt), nach einem "[array release]" verschwinden, stimmt's?

    Im Prinzip: Ja
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Im Prinzip: Ja




    Danke Euch beiden, dann besteht ja doch noch Hoffnung, ich hatte schon an meinem (grundsätzlichen) Verständnis gezweifelt. Meine ursprüngliche Verwirrung oben war darauf zurückzuführen, dass ich nicht an das Release des Elementes nach dem Hinzufügen zum Array gedacht hatte (möglich aufgrund der starken Referenz durch das Array) ... obwohl ich es im Code so mache.

    Das angesprochene Memory-Problem hat andere Ursachen, denen ich gerade so nach und nach auf die Spur kommen ... 's ist eben Code aus meiner (Cocoa- / ObjectiveC-) Anfängerzeit :D

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.