Posen & Co.

  • RE: Posen & Co.

    Original von M.A.X
    Doch noch eine Frage: warum crsht es dann an ganz anderen Enden des Porgramms, sogar in anderen Threads? Wenn auf nicht bessenen Speicher zugegriffen wird, dann müsste es doch sofort bei der erstellung einer instanz crashen...
    Nicht unbedingt.

    Die geposte Subklasse erbt doch alle Methoden der ursprünglichen. Überschrieben werden nur ein paar wenige. Aber die anderen gibt es noch und sie werden auch ausgeführt (sonst hättest Du ja einfach eine neue Klasse schreiben können).

    Soweit ich es sehe ist z.B. -dealloc NICHT dabei.

    Also wird ggf. das ursprüngliche dealloc aufgerufen.

    Und das sieht meist so aus
    - (void) dealloc { [_var1 release]; [_var2 release]; [super dealloc]; }

    Und nun hast Du eine posende Klasse bei der es _var2 nicht gibt. Dann geht _release an einen ungültigen Pointer. Das muss aber nicht zwangsläufig zu einem sofortigen Fehler führen, abhängig davon was da gerade im Speicher steht. Und das kann auch ein gültiges anderes Objekt sein, das auf einmal einen release zuviel bekommt.

    Beim init wird zwar auf _var2 geschrieben, was damit vielleicht den Anfang einer anderen Instanz beschädigt, aber das merkt man erst wenn man diese benutzt (z.B. durch einen autorelease).

    Damit ist m.E. erklärt warum die geposte Subklasse nicht weniger sondern sogar exakt die gleichen Instanzvariablen haben muß. Warum sie aber nicht mehr haben darf, leuchtet mich auch nicht ein.

    Wo ich das schreibe fällt mir auf dass ich genau das in seltenen Fällen sogar schon gemacht habe (eine Art Instanzvariablen-Category), weil es mir bisher nicht als Einschränkung bewußt war. Probleme sind mir nicht aufgefallen.

    -- hns
  • RE: Posen & Co.

    Original von hns
    Damit ist m.E. erklärt warum die geposte Subklasse nicht weniger sondern sogar exakt die gleichen Instanzvariablen haben muß. Warum sie aber nicht mehr haben darf, leuchtet mich auch nicht ein.

    Das wiederrum könnte man so erklären, dass das posen ja nicht am Anfang passieren muss. Das heißt, du kannst schon instanzen der superklasse haben und die haben eine fest zugewiese größe. Wenn du die jatzt mit mehr instanzen überpost, dann existeiren verweise auf nicht alloziierten Speicher...

    Danke euch beiden für eure Hilfe. Jetzt ist mir da einiges klarer :)
  • RE: Posen & Co.

    Weil die posierende Klasse nicht ausreichend Speicher vorhanden ist. Ein Zugriff darauf kann dann wieder zur Britzelei von etwas anderem führen. Vorhersagbar ist das nicht.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?