@dynamic und @synthesize in NSManagedObject

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

  • @dynamic und @synthesize in NSManagedObject

    Hallo zusammen,

    ich befasse mich gerade intensiv mit Objective-C und bin gerade auf ein Problem gestoßen. Ich lese Daten mit Hilfe von Core Data aus, was weitesgehend einwandfrei funktioniert.
    Mein Product erbt von NSManagedObject und wurde aus dem xcdatamodel generiert. Also sind alle Properties @dynamic. In Product habe ich u.a. die Property name und description.
    Nach dem fetch kann ich auf name zugreifen, aber bei dem Zugriff auf description stuerzt die App ohne Errormeldung ab.

    Nach langer suche habe ich vor description aus verzweiflung mal @dynamic mit @synthesize ersetzt und es hat funktioniert. Kann mir jemand von euch erklaeren warum das so ist? - Ich habe es so verstanden, das synthesize die Accessors schon mit kompiliert und dynamic die Accessors erst zur Laufzeit erstellt - in diesem Fall ueber NSManagedObject. Ich verstehe nicht, warum bei mir dann dynamic fuer description nicht funktioniert und noch weniger, warum synthesize funktioniert :huh: Synthesize sollte doch an dieser Stelle voellig falsch sein oder nicht?

    Erbt von NSManagedObject:

    Quellcode

    1. @interface Product : NSManagedObject
    2. {
    3. }


    Quellcode

    1. @implementation Product
    2. @synthesize description;
    3. @dynamic name;
    4. @end


    Der spaetere Zugriff sieht so aus:

    Quellcode

    1. nameLabel.text = product.name; //Funktioniert
    2. descriptionLabel.text = product.description; //Programmabsturz bei @dynamic, funktioniert bei @synthesize



    Ich bin fuer jeden Ratschlag Dankbar!
  • Robhuhn schrieb:

    Hallo zusammen,

    ich befasse mich gerade intensiv mit Objective-C und bin gerade auf ein Problem gestoßen. Ich lese Daten mit Hilfe von Core Data aus, was weitesgehend einwandfrei funktioniert.
    Mein Product erbt von NSManagedObject und wurde aus dem xcdatamodel generiert. Also sind alle Properties @dynamic. In Product habe ich u.a. die Property name und description.
    Nach dem fetch kann ich auf name zugreifen, aber bei dem Zugriff auf description stuerzt die App ohne Errormeldung ab.

    Nach langer suche habe ich vor description aus verzweiflung mal @dynamic mit @synthesize ersetzt und es hat funktioniert. Kann mir jemand von euch erklaeren warum das so ist? - Ich habe es so verstanden, das synthesize die Accessors schon mit kompiliert und dynamic die Accessors erst zur Laufzeit erstellt - in diesem Fall ueber NSManagedObject. Ich verstehe nicht, warum bei mir dann dynamic fuer description nicht funktioniert und noch weniger, warum synthesize funktioniert :huh: Synthesize sollte doch an dieser Stelle voellig falsch sein oder nicht?

    Erbt von NSManagedObject:

    Quellcode

    1. @interface Product : NSManagedObject
    2. {
    3. }


    Quellcode

    1. @implementation Product
    2. @synthesize description;
    3. @dynamic name;
    4. @end


    Der spaetere Zugriff sieht so aus:

    Quellcode

    1. nameLabel.text = product.name; //Funktioniert
    2. descriptionLabel.text = product.description; //Programmabsturz bei @dynamic, funktioniert bei @synthesize



    Ich bin fuer jeden Ratschlag Dankbar!

    'description' ist bereits eine Methode in NSObject.
    Im "Core Data Programming Guide" steht dazu:
    You are discouraged from overriding description—if this method fires a fault during a debugging operation, the results may be unpredictable—and initWithEntity:insertIntoManagedObjectContext:.
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    'description' ist bereits eine Methode in NSObject.

    Hm, da hab ich was ueberlesen. Dann werde ich das Attribut umbenennen.
    Vielen Dank fuer die Hilfe! :)


    @edit
    Achso, falls jemand noch weiß, warum @synthesize in dem Fall funktioniert, bin ich ganz Ohr. Scheinbar gibt es da etwas, was ich noch nicht ganz verstanden habe. Ich haette vermutet, dass Core Data mit @synthesize keine Moeglichkeit hat das Attribut zu beschreiben.

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

  • Robhuhn schrieb:

    @edit
    Achso, falls jemand noch weiß, warum @synthesize in dem Fall funktioniert, bin ich ganz Ohr. Scheinbar gibt es da etwas, was ich noch nicht ganz verstanden habe. Ich haette vermutet, dass Core Data mit @synthesize keine Moeglichkeit hat das Attribut zu beschreiben.

    Könnte daran liegen dass @synthesize die Methode - description neu definiert, als einfachen Getter. Da du vorhin die property 'description' definiert hattest ist da mit @dynamic irgendwas wohl schief gelaufen, z.B. falls deine property 'description' kein String war. Das müsste man sich genauer ansehen, bringt dir aber nichts weil die Ursache ja klar ist. ;)
    Widgetschmie.de • Life is too short for gadgets
  • Robhuhn schrieb:

    longW schrieb:

    'description' ist bereits eine Methode in NSObject.

    Hm, da hab ich was ueberlesen. Dann werde ich das Attribut umbenennen.
    Vielen Dank fuer die Hilfe! :)


    @edit
    Achso, falls jemand noch weiß, warum @synthesize in dem Fall funktioniert, bin ich ganz Ohr. Scheinbar gibt es da etwas, was ich noch nicht ganz verstanden habe. Ich haette vermutet, dass Core Data mit @synthesize keine Moeglichkeit hat das Attribut zu beschreiben.

    Das ist auch in gewisser Weise richtig. @synthesize erzeugt bei dir mutmaßlich eine iVar und Getter und Setter. Da der Getter -description lautet und ich vermute, dass du als Typen NSString* angegeben hast, wird einfach die Methode -descritption von NSObject überschrieben. Das "funktioniert" also gewissermaßen durch Zufall.
    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"?
  • Pascal schrieb:

    Robhuhn schrieb:

    @edit
    Achso, falls jemand noch weiß, warum @synthesize in dem Fall funktioniert, bin ich ganz Ohr. Scheinbar gibt es da etwas, was ich noch nicht ganz verstanden habe. Ich haette vermutet, dass Core Data mit @synthesize keine Moeglichkeit hat das Attribut zu beschreiben.

    Könnte daran liegen dass @synthesize die Methode - description neu definiert, als einfachen Getter. Da du vorhin die property 'description' definiert hattest ist da mit @dynamic irgendwas wohl schief gelaufen, z.B. falls deine property 'description' kein String war. Das müsste man sich genauer ansehen, bringt dir aber nichts weil die Ursache ja klar ist. ;)

    @dynamic funktioniert bei Core Data (und überlicherweise) über das Forwarding. Existiert bereits eine Methode mit diesem Namen, gibt es kein Forwarding und damit auch kein funktionierendes @dynamic.
    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"?