Стиль kvo: почему значение не может быть обновлено с помощью указателей? - PullRequest
0 голосов
/ 01 апреля 2012

Я читал учебник о KVO, пример показывает, что значение не обновляется, когда мы не используем стиль KVO, поэтому мне было интересно: почему, если объект передается по "ссылке" (с id или Position*), и поэтому, если мы используем указатель на «anObject», не будет ли обновлено значение (из объекта)?

, поэтому вот код: в «main»:

// Create initial position
Position* pos = [[Position alloc] init];
pos.latitude = 45.0;
pos.longitude = 12.0;
pos.altitude = 30.0;

// Create a basic tracker
ValueTracker * tracker = [ValueTracker createValueTrackerForKey:@"latitude" onObject:pos];

// Dump initial state
NSLog(@"Tracker (1): %@", tracker);

pos.latitude += 5.0;
pos.longitude += 5.0;
pos.altitude += 10.0;

NSLog(@"Tracker (2): %@", tracker); //the values are not updated

объект:

@interface Position : NSObject {

    float latitude;
    float longitude;
    float altitude;
}

@property(assign, readwrite) float latitude;
@property(assign, readwrite) float longitude;
@property(assign, readwrite) float altitude;

и функция: здесь anObject - указатель на Position, почему значение не может быть обновлено с помощью указателя?

+ (ValueTracker *) createValueTrackerForKey: (NSString *) aKey 
                                 onObject: (id) anObject
{
    ValueTracker * tracker = [[ValueTracker alloc] init];

    tracker.valueKey = aKey;
    tracker.source = anObject;
    tracker.value = [anObject valueForKey: tracker.valueKey];

    return tracker;
}

edit: вот когда мы используем систему kvo:

[tracker enableObserving];

и в классе ValueTracker:

- (void) enableObserving
{
    if ( nil != source ) {
        /* We specify in options that we want to get both old and new value
         for the property.
         */
        [source addObserver: self 
                 forKeyPath: valueKey 
                    options:(NSKeyValueObservingOptionNew |
                             NSKeyValueObservingOptionOld)
                    context: NULL];
    }
}

edit n° 2:

- (void) observeValueForKeyPath: (NSString *) keyPath 
                       ofObject: (id) object 
                         change: (NSDictionary *) change 
                        context: (void *) context
{
    NSLog(@"Value %@ changed! Here is the changeset: %@", keyPath, change);
    //NSLog(@"Dump on observation: %@", [self description]);
    value = [change valueForKey:NSKeyValueChangeNewKey];
}

1 Ответ

0 голосов
/ 01 апреля 2012

Похоже, вы забыли синтезировать свои iVars?

@implementation Position

@synthesize latitude, longitude, altitude;

...

@end
...