Problem mit Instanzen

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Problem mit Instanzen

    Hallo zusammen,


    folgendes Problem: Ich habe mir eine Klasse mit einigen Methoden und einigen Objekten erstellt, d.h. in dieser Klasse erzeuge ich wieder andere Klasseninstanzen.

    Quellcode

    1. @interface objectController : NSObject {
    2. myObject *aufgabenObject;
    3. }
    4. @property(nonatomic, retain) myObject* aufgabenObject;



    In meiner Delegate erzeuge ich eine Instanz vom objectController, sagen wir mal controller1. Diesen benötige ich immer wieder. In einer Methode in der Delegate erzeuge ich mir "kurz" eine weitere Instanz meines objectControllers, sagen wir mal controller2, um unabhängig von der anderen Instanz einige Aufgaben zu erledigen. Beide Instanzen von objectController, also controller1 und controller2 haben auch unterschiedliche Adressen. Soweit OK.

    Irgend etwas stimmte aber bei meinen Ergebnissen nicht. controller1 und controller2 haben jeweils Instanzen von myObject, aufgabe1 im controller1 und aufgabe2 im controller2 ... und da entdeckte ich mein Problem: aufgabe1 und aufgabe2 verweisen auf die gleiche Adresse!!! Wie kann das sein?????????

    Was habe ich da falsch gemacht?
    Um Rekursion zu verstehen, muss man erst Rekursion verstehen!
  • Wahrscheinlich hast Du irgendwo sowas wie

    Quellcode

    1. controller1.aufgabenObject = controller2.aufgabenObject;
    stehen. Bei einer solchen Zuweisung werden im Wesentlichen Zeiger zugewiesen und keine Objekte kopiert.

    EDIT: In der Regel ist das auch kein Fehler, da Objective-C über das Referenzen zählen sicherstellt, dass das referenzierte Objekt (= die Aufgabe) nicht zu früh zerstört wird.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Wahrscheinlich hast Du irgendwo sowas wie

    Quellcode

    1. controller1.aufgabenObject = controller2.aufgabenObject;
    stehen. Bei einer solchen Zuweisung werden im Wesentlichen Zeiger zugewiesen und keine Objekte kopiert.


    Nee, nee ... Die App war bisher ok, was die erste "Haupt"-Instanz von objectController in der Delegate angeht. Habe bezüglich OS4 und Mutitasking eine Anpassung vorbereitet, also noch nix umfangreiches gemacht; lediglich eine Methode in die Delegate eingefügt und in der Methode erzeuge ich die zweite Instanz und vernichte sie dort auch wieder; da viel mit schon ein BAD_ACCCESS auf und wunderte mich kurz mal... dann hab ich mir die Speicheradressen angesehen und siehe da ... da stimmte was nicht, die waren nämlich gleich!. So viel Code war da noch gar nicht, gerade mal der Erzeugercode; keinerlei Zuweisungen oder sowas. Ich hatte wie gesagt die globale Instanz controller1 im Header der Delegate deklariert und in applicationDidFinishLaunching oder so ähnlich initialisiert; am Ende im Dealloc-Bereich released. Soweit Ok. Mit der Erzeugung der zweiten Instanz controller2 in der eingefügten Methode verwiesen controller1 und controller2 auf die gleiche Adresse; da war ich bereits völlig konfus! Hab dann die Instanz ebenfalls in den Header der Delegate gepackt und in der Methode initialisiert - dann hatte ich zwei verschiedene Adressen, jedoch die Unterobjekte verwiesen auf die gleiche Adresse wie im ersten Post beschrieben.

    Nur so für mich zum Verständnis (das sind jetzt wohl Basic-Fragen): Es kann doch eigentlich nicht sein, dass ich eine globale Instanz objectController in der Delegate mit alloc erzeuge und in einer Methode eine weitere Instanz mit alloc erzeuge und die die gleiche Adresse haben oder? Weiterhin kann das doch auch nicht der Fall für Unterobjekte sein? Oder? ?(

    Ich werde mir das heute Abend nochmal ansehen und Screenshots machen .... Möglicherweise ist das ein Bug. Werde alle Precompiled Sachen mal löschen und nochmal builden .... X(
    Um Rekursion zu verstehen, muss man erst Rekursion verstehen!
  • contact schrieb:

    Nur so für mich zum Verständnis (das sind jetzt wohl Basic-Fragen): Es kann doch eigentlich nicht sein, dass ich eine globale Instanz objectController in der Delegate mit alloc erzeuge und in einer Methode eine weitere Instanz mit alloc erzeuge und die die gleiche Adresse haben oder? Weiterhin kann das doch auch nicht der Fall für Unterobjekte sein? Oder?

    Mit Alloc erzeugst Du, falls Du es nicht überschrieben hast, immer neue Objekte.

    contact schrieb:

    Ich werde mir das heute Abend nochmal ansehen und Screenshots machen .... Möglicherweise ist das ein Bug. Werde alle Precompiled Sachen mal löschen und nochmal builden ....

    Du solltest vielleicht besser erst mal den Fehler bei Dir suchen.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Zitat von »contact«
    Ich werde mir das heute Abend nochmal ansehen und Screenshots machen .... Möglicherweise ist das ein Bug. Werde alle Precompiled Sachen mal löschen und nochmal builden ....

    macmoonshine schrieb:

    Du solltest vielleicht besser erst mal den Fehler bei Dir suchen.


    Deshalb poste ich ja hier auch u.A. mit der Frage: Was hab ICH hier falsch gemacht; SchlaubiSchlumpf! 8)
    Um Rekursion zu verstehen, muss man erst Rekursion verstehen!
  • macmoonshine schrieb:

    contact schrieb:

    Möglicherweise ist das ein Bug.
    Hört sich aber nicht so an. Selber SchlaubiSchlumpf :P

    Hm ok, dann ist das eventuell nicht 100%ig formuliert; meinte damit die Tatsache, dass man manchmal den ganzen build-Ordner löschen musste, um einen sauberen Neu-Build hinzubekommen, weil irgendwas falsch "verdrahtet" war. Ob man das nun Bug nennt oder nicht ... das Problem mit den Instanzen kann ich mir ja nun auch nicht erklären, zumal das nicht wirklich meine erste Zeile Code ist... jedoch gestehe ich mir selbst bezüglich Objective-C noch 'ne Menge Fehler zu (programmiere darin erst seit 1 1/2 Jahren). Es ist kein Garant für sauberen und fehlerfreien Code, nur weil alles so funktioniert, wie ich wollte. Ich arbeite gerade das ein oder andere Buch durch und wundere mich eben, dass ich gerade da den Fehler nicht sehe. Aber wie gesagt, heute Abend nochmal in Ruhe nachsehen.

    Alles wird gut ... hoffe ich! :thumbup:
    Um Rekursion zu verstehen, muss man erst Rekursion verstehen!