initWithCoder wird auf bestimmtem Device nicht aufgerufen

  • initWithCoder wird auf bestimmtem Device nicht aufgerufen

    Hallo,

    ich speichere ein Objekt einer eigenen Klasse in den UserDefaults. Dazu verwende ich NSKeyedArchiver und implementiere eine encodeWithCoder:-Methode. Nach dem Start (bzw. wenn ich es brauche), hole ich mir die Daten aus den UserDefaults und verwende NSKeyedUnarchiver um alles wieder zurück zu schubsen.

    Nun passiert folgendes (ist jetzt kein Feldtest):
    - Auf dem iPhone 4 mit iOS 4.3.2 wird die initWithCoder:-Methode sauber angesprungen. Jedenfalls hält der Breakpoint dort brav an.
    - Auf dem iPod touch 3G mit iOS 4.2.1 wird beim Unarchivieren weder die init:- noch die initWithCoder:-Methode angesprungen. Das Ergebnis des Auspackens ist dann natürlich auch Null (oder nil).

    So recht kann ich mir das nicht erklären, denn die besagten Mechanismen sind laut Doku seit iOS 2.0 verfügbar.

    Woran mag das liegen?!
  • Ja, sie sind da. Ich habe mir sowohl das UserDefault-Objekt (gibt einen NSData-Block), als auch das Ergebnis des KeyedUnarchiver (gibt (null)) per NSLog ausgeben lassen.

    Aber ich schließe aus Deiner Frage, dass dieses Verhalten ungewöhnlich ist ...

    Kann es zeitkritisch sein? Ich schreibe den Wert weg (au dem iPod touch - beim iPhone nicht wg. MT), sobald die App ein applicationDidEnterBackground: (UIApplication *)application: erhält. Kann es sein, dass der Prozess während des Schutdown der App "verreckt", will sagen: Das weggeschriebene Objekt ist fehlerhaft?
  • fwtag schrieb:

    Aber ich schließe aus Deiner Frage, dass dieses Verhalten ungewöhnlich ist ...

    Bei funktioniert es auch auf dem iPod-Touch. Ich vermute, dass es nicht am Archiver liegt.

    fwtag schrieb:

    Das weggeschriebene Objekt ist fehlerhaft?

    Diese Vermutung liegt nahe. Am besten mal Löschen und neu erzeugen. Vielleicht hast Du auf dem iPod noch einen alten, inkompatiblen Datenstand.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Zitat von »fwtag«
    Das weggeschriebene Objekt ist fehlerhaft?

    Diese Vermutung liegt nahe. Am besten mal Löschen und neu erzeugen. Vielleicht hast Du auf dem iPod noch einen alten, inkompatiblen Datenstand.

    Das war es tatsächlich! Der hat nur die Hälfte (ungefähr) des NSData-Blocks weggeschrieben - und dieser Stummel ließ sich dann nicht mehr dekodieren. Wieder was gelernt.
  • Wenn Du das Objekt eh per NSKeyedArchiver in ein NSData umwandelst, dann kannst Du es auch einfach als File z.B. im NSApplicationSupportDirectory ablegen.

    Je nach Größe des serialized Objects wird sich die Größe der UserDefaults Datei dadurch nicht so stark "aufblähen" und lässt sich somit schneller laden und speichern.
  • Das Objekt ist noch nicht mal sehr groß. Es ist von NSObject abgeleitet und enthält vier eigene ivars (2 NSStrings, 1 NSNumber und 1 Bool); die Strings sind je nicht länger als 15 Zeichen. Ich kenne nun den Overhead nicht, aber das Objekt sollte durch diese ivars nicht mehr als 50 Byte Inhalt haben.

    Es ist schon seltsam, dass sich das Timing so auswirkt.