Wie stellen Sie fest, ob ein Objekt (Selbst) mit vielen Eigenschaften geändert wurde?

Die Kurzversion der Frage:
Ich habe eine Klasse mit einer Menge deklarierter Eigenschaften, und ich möchte verfolgen, ob Änderungen daran vorgenommen wurden oder nicht, damit beim Aufrufen von asave Methode darauf, schreibt es nicht in die Datenbank, wenn es nicht benötigt wird. Wie aktualisiere ich eineisDirty Eigentumohne benutzerdefinierte Setter für alle deklarierten Eigenschaften zu schreiben?

Die längere Version der Frage:
Nehmen wir an, ich habe eine Klasse wie diese:

@interface MyObject : NSObject
{
@property (nonatomic, retain) NSString *myString;
@property (nonatomic, assign) BOOL     myBool;
// ... LOTS more properties
@property (nonatomic, assign) BOOL     isDirty;
}

...

@implementation MyObject
{
@synthesize myString;
@synthesize myBool;
// ... LOTS more synthesizes :)
@synthesize isDirty;
}

Versuch 1
Mein erster Gedanke war zu implementierensetValue:forKey: so was:

- (void)setValue:(id)value forKey:(NSString *)key {
    if (![key isEqualToString:@"isDirty"]) {
        if ([self valueForKey:key] != value) {
            if (![[self valueForKey:key] isEqual:value]) {
                self.isDirty = YES;
            }
        }
    }
    [super setValue:value forKey:key];
}

Dies funktioniert perfekt, bis Sie den Wert direkt mit einem Setter einstellen (d. H.myObject.myString = @"new string";), in welchem ​​FallsetValue:forKey: wird nicht angerufen (ich bin nicht sicher, warum ich dachte, dass es sein würde, lol).

Versuch 2
Beobachte alle Eigenschaften deines Selbst.

- (id)init
{
    // Normal init stuff
    // Start observing all properties of self
}

- (void)dealloc
{
    // Stop observing all properties of self
}

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context
{
    // set isDirty to true
}  

Ich bin mir ziemlich sicher, dass dies funktionieren wird, aber ich denke, dass es einen besseren Weg geben muss. :) Ich möchte auch, dass dies automatisch erfolgt, damit ich keine Liste der zu überwachenden Eigenschaften führen muss. Ich kann leicht erkennen, dass ich vergessen habe, der Liste eine Eigenschaft hinzuzufügen, wenn ich dies später fortsetze und dann versuche, herauszufinden, warum mein Objektmanchmal wird nicht gerettet.

Hoffentlich übersehen ich eine viel einfachere Herangehensweise an dieses Problem!

Endgültige Lösung
Siehe meine Antwort unten für meine endgültige Lösung. Es basiert auf der Antwort von Josh Caswell, ist aber ein funktionierendes Beispiel.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage