Objekt kopieren

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

  • Objekt kopieren

    Hallo,
    ich erzeuge in meine ersten ViewController ein Objekt. Drückt man nun bearbeiten, erzeuge ich einen zweiten modalen ViewController, der als Delegate den ersten ViewController hat. Zuerst soll dann das Objekt in den zweiten kopiert werden. Bezwecken will ich damit, dass wenn der User jetzt was verändert aber dann Cancel drückt, einfach das kopierte Objekt gelöscht wird. Drückt er aber Done soll das Objekt vom ersten ViewController durch das kopierte Objket ersetzt werden und das View aktualisiert werden.

    Nun im ersten ViewController wird das Objekt erzeugt und initalisiert mit den jetzigen Datum. Im zweiten ist das Objekt nur deklariert. Wenn das View erzeugt wird soll er den getter des Objektes im ersten ViewController aufrufen ( kopiertesObjekt = [[self delegate] getObjekt])

    Meine Frage ist nun ob jetzt das Objekt wirklich kopiert wird oder nur der Zeiger und es gibt jetzt immer noch dieses eine Objekt?
  • du kannst entweder das objekt kopieren (copy), dann musst du deine klasse aber so erweitern dass sie korrekt kopiert werden kann (siehe copy-protocoll).

    alternativ kannst du die daten ja einfach in die GUI laden und erst sobald auf speichern geklickt wird in das objekt speichern ansonsten eben verwerfen.
  • Bayer schrieb:

    Hallo,
    ich erzeuge in meine ersten ViewController ein Objekt. Drückt man nun bearbeiten, erzeuge ich einen zweiten modalen ViewController, der als Delegate den ersten ViewController hat. Zuerst soll dann das Objekt in den zweiten kopiert werden. Bezwecken will ich damit, dass wenn der User jetzt was verändert aber dann Cancel drückt, einfach das kopierte Objekt gelöscht wird. Drückt er aber Done soll das Objekt vom ersten ViewController durch das kopierte Objket ersetzt werden und das View aktualisiert werden.

    Nun im ersten ViewController wird das Objekt erzeugt und initalisiert mit den jetzigen Datum. Im zweiten ist das Objekt nur deklariert. Wenn das View erzeugt wird soll er den getter des Objektes im ersten ViewController aufrufen ( kopiertesObjekt = [[self delegate] getObjekt])

    Meine Frage ist nun ob jetzt das Objekt wirklich kopiert wird oder nur der Zeiger und es gibt jetzt immer noch dieses eine Objekt?


    Du hast soweit nur das eine Objekt. Das kannt Du, wie 'gritsch' beschrieben hat, kopieren, und dann Deinen Ansatz weiter verfolgen.
    I would be embarrassed if they did not spy on me.
  • Bayer schrieb:

    Jetzt noch was zum Kopieren. Da ja mein erster ViewController das Delegate von zweiten ViewController ist, habe ich gemacht:

    Quellcode

    1. newObjekt = [[self delegate].objekt copy];


    Da sagt er aber: request for member 'objekt' in something not a structure or union




    Muss ich es anders kopieren?


    delegate ist wohl als id typisiert. musst du also casten oder den getter korrekt angeben!

    und vergiss das autorelease nicht!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von gritsch ()

  • So,
    jetzt habe ich .objekt und objekt geändert. Ich habe bei Google gelesen, weil delegate vom typ id ist, das gegen .objekt der Compiler was hat. Und noch lässt sich das Projekt auch compilieren.

    Quellcode

    1. newObjekt = [[[self delegate] objekt] copy];



    Nur hier stürzt dann die App ohne Fehlermeldung ab. Muss ich da anders kopieren? In meinen Delegate habe ich für Objekt *objekt eine property angelegt. Warum funktioniert das nicht?
  • Nur hab ich das Copying-Protokoll verwendet:


    Quellcode

    1. @interface Objekt : NSObject <NSCopying>


    Quellcode

    1. - (id)copyWithZone:(NSZone *)zone {
    2. Objekt *copyObjekt;
    3. copyObjekt = [[[self class] allocWithZone:zone] init];
    4. [copyObjekt setCategory:[self category]];
    5. [copyObjekt setObjektDate:[self objektDate]];
    6. return copyObjekt;
    7. }


    Ich dachte copy ruft dann copyWithZone auf?
  • Bayer schrieb:

    Nur hab ich das Copying-Protokoll verwendet:


    Quellcode

    1. @interface Objekt : NSObject <NSCopying>


    Quellcode

    1. - (id)copyWithZone:(NSZone *)zone {
    2. Objekt *copyObjekt;
    3. copyObjekt = [[[self class] allocWithZone:zone] init];
    4. [copyObjekt setCategory:[self category]];
    5. [copyObjekt setObjektDate:[self objektDate]];
    6. return copyObjekt;
    7. }


    Ich dachte copy ruft dann copyWithZone auf?


    Ich wäre mir gar nicht sicher, ob dass der Fehler ist.

    Nimm doch mal diese Zeile auseinander und schaue genau nach:

    Bayer schrieb:

    So,
    jetzt habe ich .objekt und objekt geändert. Ich habe bei Google gelesen, weil delegate vom typ id ist, das gegen .objekt der Compiler was hat. Und noch lässt sich das Projekt auch compilieren.

    Quellcode

    1. newObjekt = [[[self delegate] objekt] copy];


    Nur hier stürzt dann die App ohne Fehlermeldung ab. Muss ich da anders kopieren? In meinen Delegate habe ich für Objekt *objekt eine property angelegt. Warum funktioniert das nicht?




    Also:
    a) Gibt es 'delegate' ?
    b) Gibt es 'objekt''? (Nebenbei, nenne das vernünftiger.)
    c) Funktioniert '-copy'' ?
    I would be embarrassed if they did not spy on me.
  • Ja das Delegate ist der erste ViewController. Objekt als Begriff habe ich nur hier als Beispiel, aber wenn ich ein NSLog mache im Getter, dann sehe ich es auch in der Console. dass der Getter aufgerufen wird. Ich bekomme ja durch [[self delegate] objekt] den Zeiger auf objekt von ersten ViewController. Ich will ja dann dies Objekt mit copy kopieren. Ich weis aber nicht ob man das so macht. In der Klasse habe ich ja das <NSCopying> Protokoll und dann die Methode copyWithZone. In der Dokumentation steht ja dann, mann soll einfach copy aufrufen und das regelt dann das mit den geforderten NSZone und so.
  • Bayer schrieb:

    Ja das Delegate ist der erste ViewController. Objekt als Begriff habe ich nur hier als Beispiel, aber wenn ich ein NSLog mache im Getter, dann sehe ich es auch in der Console. dass der Getter aufgerufen wird. Ich bekomme ja durch [[self delegate] objekt] den Zeiger auf objekt von ersten ViewController. Ich will ja dann dies Objekt mit copy kopieren. Ich weis aber nicht ob man das so macht. In der Klasse habe ich ja das <NSCopying> Protokoll und dann die Methode copyWithZone. In der Dokumentation steht ja dann, mann soll einfach copy aufrufen und das regelt dann das mit den geforderten NSZone und so.


    und was funktioniert nicht? fehlermeldung?