(void*)observationInfo

  • (void*)observationInfo

    Hallo,

    mal ne (vermutlich ziemlich blöde) Frage. Wenn ich mir durch (void*)observationInfo den Info-Block (gecastet als NSDictionary) abhole, bekomme ich z. B. folgendes Ergebnis bei Ausgabe mit NSLog:

    Quellcode

    1. <NSKeyValueObservationInfo 0x3b17bb0> (
    2. <NSKeyValueObservance 0x3b17b40: Observer: 0x3b12620, Key path: frame, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x3b17680>
    3. )

    Irgendwie deucht mich dieses Ausgabeformat Wunder - es sieht anders aus als bei anderen Dictionaries.

    Wie komme ich denn an die einzelnen Werte heran? Ich habe es diletantisch mit z.B. objectForKey:"Key path" und valueForKey:"Key path" versucht, leider gibt das eine Exception, weil der selector nicht unterstützt wird ...
  • Setze mal eine String-Konstante auf als context: Parameter (in addObserver:forKeyPath:options:context:) und prüfe auf diese in observeValueForKeyPath:ofObject:change:context:
    Evtl. verarbeitest Du ein Observierung, die nicht für Dich ist (sondern irgendwo durch das Framework veranlasst wurde). Am besten etwas mehr Beispiel-Code posten.

    Ach ja, das Dictionary mit den Änderungen ist (wie der name schon sagt) der change: Parameter...siehe Doku.
  • Ich habe etwas kompliziert gedacht. Ich wollte wissen, ob ich bereits einen observer bei einem superview registriert habe. Die Überprüfung sollte in didMoveToSuperview erfolgen. Aber ich habe das jetzt anders gelöst.

    Daher nun eher die theoretische Frage: Wenn ich noch wollte - komme ich irgendwie an diese Werte?
  • Das Thema hatten wir schon einmal: addObserver - überprüfen ob bereits registriert , wobei ich Amins Hinweis auf observationInfo eher ironisch verstehe. Apple versteckt nicht nur die dahinter liegenden Daten durch einen Void-Pointer sondern gibt der Klasse NSKeyValueObservationInfo auch keine Methoden, um auf die enthaltenen Daten zuzugreifen.

    Quellcode

    1. class-dump /System/Library/Frameworks/Foundation.framework/Foundation | less
    2. @interface NSKeyValueObservationInfo : NSObject
    3. {
    4. long long _retainCountMinusOne;
    5. NSArray *_observances;
    6. unsigned long long _cachedHash;
    7. BOOL _cachedIsShareable;
    8. NSHashTable *_observables;
    9. }
    10. - (id)_initWithObservances:(id *)arg1 count:(unsigned long long)arg2;
    11. - (id)retain;
    12. - (oneway void)release;
    13. - (unsigned long long)retainCount;
    14. - (void)dealloc;
    15. - (unsigned long long)hash;
    16. - (BOOL)isEqual:(id)arg1;
    17. - (id)description;
    18. @end
    19. @interface NSKeyValueObservance : NSObject
    20. {
    21. long long _retainCountMinusOne;
    22. NSObject *_observer;
    23. NSKeyValueProperty *_property;
    24. unsigned long long _options;
    25. void *_context; NSObject *_originalObservable;
    26. unsigned long long _cachedUnrotatedHashComponent;
    27. BOOL _cachedIsShareable;
    28. NSPointerArray *_observationInfos;
    29. struct auto_weak_callback_block _observerWentAwayCallback;
    30. }
    31. - (id)_initWithObserver:(id)arg1 property:(id)arg2 options:(unsigned long long)arg3 context:(void *)arg4 originalObservable:(id)arg5;
    32. - (id)retain;
    33. - (oneway void)release;
    34. - (unsigned long long)retainCount;
    35. - (void)dealloc;
    36. - (unsigned long long)hash;
    37. - (BOOL)isEqual:(id)arg1;
    38. - (id)description;
    39. - (void)observeValueForKeyPath:(id)arg1 ofObject:(id)arg2 change:(id)arg3 context:(void *)arg4;
    40. @end
    Alles anzeigen
    Da will also jemand definitiv etwas vor Dir geheim halten.
    „Meine Komplikation hatte eine Komplikation.“