Я читал учебник о 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];
}