In Header-Datei bei copy und retain kein Unterschied bei den Speicheradressen

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

  • In Header-Datei bei copy und retain kein Unterschied bei den Speicheradressen

    Hallo,

    ich bin bei Kapitel 3 »Properties - Kopie und Verweis«.

    Quellcode

    1. @property( readwrite, copy ) NSString* name;



    Die Speicherzuweiseung ändert sich hierbei nicht, wenn ich statt copy, retain angebe. Bei retain müsste ja die Adresse meiner Objekte, die ich mit retain verbinde, im Speicher gleich bleiben. Zumindest dem Buch zufolge. Auch wird nach dem Abschnitt (Projekt-03-07) im Buch angegeben, dass ich den entsprechenden Code auf der Autorenseite (= cocoading.de/Common/Article.php?Area=1&Article=6&Page=3) herunter laden kann. Habe ich gemacht, um den Autorencode mit meinem zu vergleichen. Jedoch ist da nicht der Stand vom Abschnitt »Properties - Kopie und Verweis«, sondern vom Abschnitt davor.
  • versuch das ganze doch mal mit NSMutableString ;-)[/quote]

    gritsch schrieb:

    NSMutableString

    gritsch schrieb:

    NSString ist NICHT VERÄNDERBAR also macht kopy keinen sinn. NSString macht in der copy-implementation einfach ein retain!


    versuch das ganze doch mal mit NSMutableString ;)
    Habe NSMutableString versucht, da kriege ich jedoch auch unterschiedliche Speicherstellen. Die Header-Datei sieht folgendermaßen aus:

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @interface Instrument : NSObject {
    3. NSMutableString* name;
    4. NSInteger age;
    5. NSInteger price;
    6. }
    7. @property( readwrite, copy ) NSMutableString* name;
    8. @property( readwrite ) NSInteger age;
    9. @property( readwrite ) NSInteger price;
    10. // Objekterzeugung
    11. + (Instrument*)instrumentWithName:(NSMutableString*)name;
    12. - (id)initWithName:(NSMutableString*)name;
    13. // Sonstiges
    14. - (void)growOld;
    15. @end
    Alles anzeigen
  • jepster schrieb:

    versuch das ganze doch mal mit NSMutableString ;)

    gritsch schrieb:

    NSMutableString

    gritsch schrieb:

    NSString ist NICHT VERÄNDERBAR also macht kopy keinen sinn. NSString macht in der copy-implementation einfach ein retain!


    versuch das ganze doch mal mit NSMutableString ;)
    Habe NSMutableString versucht, da kriege ich jedoch auch unterschiedliche Speicherstellen. Die Header-Datei sieht folgendermaßen aus:

    Quellcode

    1. #import <Cocoa/Cocoa.h>
    2. @interface Instrument : NSObject {
    3. NSMutableString* name;
    4. NSInteger age;
    5. NSInteger price;
    6. }
    7. @property( readwrite, copy ) NSMutableString* name;
    8. @property( readwrite ) NSInteger age;
    9. @property( readwrite ) NSInteger price;
    10. // Objekterzeugung
    11. + (Instrument*)instrumentWithName:(NSMutableString*)name;
    12. - (id)initWithName:(NSMutableString*)name;
    13. // Sonstiges
    14. - (void)growOld;
    15. @end
    Alles anzeigen
    [/quote]


    das wolltest du ja - bzw du hast dich gefragt warum nach einem copy einer NSString-instanz die adressn gleich sind.
  • Amin Negm-Awad schrieb:

    Ich habe versucht, alles auf Seite 1 zu erläutern. Das ging leider nicht.

    Da wirst du wohl einfach weiterlesen müssen …

    Das ich ObjectiveC und Cocoa innerhalb einer Buchseite nicht verstehen werde, ist wohl klar.

    Das heisst also im Klartext: der im Buch beschriebene Teil mit Codebeispiel ab Seite 199, zu retain und copy, ist nicht mehr aktuell bzw. wohl eher einfach falsch - ich soll jetzt weiterlesen und wenn ich Glück habe, werde ich die Problematik verstehen?
  • Amin Negm-Awad schrieb:

    Das Beispiel ist nicht falsch und immer noch aktuell.

    Definitiv falsch ist die Aussage im Buch, dass der Stand (mit dem beschriebenen Code) von deiner Internetseite herunter geladen werden kann. Habe ich auch weiter oben schon beschrieben. Tut mir Leid und ich wäre froh darüber, wenn es anders wäre - da ich ja lernen will.

    Ansonsten macht das Codebeispiel einfach nicht das, was ich Buch betreffend der gleichen Speicherposition angegeben wird. Es werden sowohl bei retain als auch copy die gleichen Speicherpositionen ausgegeben. Wenn du dir den (sicherlich für dich einfachen) Code einmal ansehen willst, kann ich ihn hier hochladen.
  • jepster schrieb:

    Amin Negm-Awad schrieb:

    Das Beispiel ist nicht falsch und immer noch aktuell.

    Definitiv falsch ist die Aussage im Buch, dass der Stand (mit dem beschriebenen Code) von deiner Internetseite herunter geladen werden kann.

    Vorhin ging es noch um das Beispiel. Dazu war allein deine Aussage falsch.
    Zu dem Beispiel steht übrigens nicht im Buch, dass man den Code herunterladen kann. Daher ist deine Aussage auch falsch.

    jepster schrieb:

    Habe ich auch weiter oben schon beschrieben. Tut mir Leid und ich wäre froh darüber, wenn es anders wäre - da ich ja lernen will.

    Dann solltest du damit mal anfangen, anstatt deine Fehler anderen zu unterstellen.

    jepster schrieb:

    Ansonsten macht das Codebeispiel einfach nicht das, was ich Buch betreffend der gleichen Speicherposition angegeben wird. Es werden sowohl bei retain als auch copy die gleichen Speicherpositionen ausgegeben. Wenn du dir den (sicherlich für dich einfachen) Code einmal ansehen willst, kann ich ihn hier hochladen.

    Was soll ich mit deinem fehlerhaften Code?

    Das Beispiel im Buch macht das, was beschrieben ist. Und zwar schon bei weit über Tausend Lesern. Vielleicht solltest du einmal bei dir den Fehler suchen? Du willst ja lernen.
    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"?
  • jepster schrieb:

    Ansonsten macht das Codebeispiel einfach nicht das, was ich Buch betreffend der gleichen Speicherposition angegeben wird. Es werden sowohl bei retain als auch copy die gleichen Speicherpositionen ausgegeben. Wenn du dir den (sicherlich für dich einfachen) Code einmal ansehen willst, kann ich ihn hier hochladen.

    Also, so leid es mir tut : Ich weiss nicht, was Du da machst aber - wie Amin sagt - das Beispiel im Buch macht das, was es beschreibt und soll (und ich kann es auch nachvollziehen).
    Und nicht nur das, es ist sogar ausserordentlich gut erklärt, welchen Unterschied "retain" und "copy" macht (oder machen kann).

    Geradezu "sensationell" finde ich das Beispiel mit "Detlef", der seinen Namen ändert und der Aufhänger dafür ist, warum man bei Beziehungen retain statt copy nimmt.Das ist im positive Sinne so bescheuert, dass es hängen bleibt und damit gerade auch das macht, was es soll -> verständlich erklären.
    Vor der Lektüre dieses Beispiels hab ich es so gemacht, "weil man es eben so macht". Seither muss ich immer an Detlef denken und weiss, warum ich es mache.

    Hans
  • Habe den Fehler gefunden, ich hatte in der Datei ObjectiveC.m statt

    aGuitar = [Instrument instrumentWithName:name];

    das hier

    aGuitar = [Instrument instrumentWithName:@"Eine Gitarre"];

    Habe das herausgefunden, indem ich den Abschnitt von Neuem durchgegangen bin. Lag also tatsächlich an mir, sorry.

    Den Stand, an welchem die Beschreibung endet, konnte ich trotzdem nicht von der Seite herunter laden. Bisher war das bei diesen Hinweisen nämlich so der Fall. Da steht oben auf Seite 205:

    "Sie können das Projekt in diesem Zustand als »Projekt-03-07« von der Webseite herunterladen."

    Da gehe ich einfach davon aus, dass es sich um den Zustand handelt, der bis zu dieser Textstelle beschrieben wurde und nicht irgendetwas aus der Mitte. Vielleicht wäre es hilfreich, wenn in einer nächsten Auflage die genaue Seitenzahl mit angegeben ist, von welcher ausgegangen wird.

    Ist nur ein gut gemeinter Gedanke - man muss sich hier jetzt nicht darum scheren bzw. einen Kommentar dazu abgeben. Ich will, besonders dir Amin, damit nicht zu nahe treten. Ich habe großen Respekt dafür, dass du das Buch verfasst hast. Zumal angeblich die Buchvergütung für IT-Fachliteratur meist in keinem Verhältnis zur notwenigen Arbeit steht.

    Danke für eure Antworten und noch viel Spaß beim Programmieren!