KVO
についてのチュートリアルを読んでいましたが、KVOスタイルを使用していないときに値が更新されないことがわかりましたので、私は疑問を抱いていました。オブジェクトが "reference"(id
またはPosition*
)したがって、 "anObject"へのポインタを使用すると、(オブジェクトからの)値は更新されませんか?kvoスタイル:なぜ値をポインタで更新できないのですか?
ので、ここでコードは次のとおりです。 "メイン" に:
// 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;
}
編集:ここにある私たちはKVOシステムを使用する場合:
- (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];
}
}
編集N°2:
[tracker enableObserving];
とValueTrackerクラスの
- (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];
}
あなたは実際にそのコードで何が起こると思われますか?あなたが提供したことから、トラッカーオブジェクトは、印刷されるときに「緯度」の値が同じになると思います。あなたはKVOについて言及していますが、このコードでは使用していません。 –
@ Paul.s:ええ、私の投稿を編集しましたが、私の質問は「なぜ」ポインタがちょうど十分な値を変更しないのですか?実際には同じ値ですが、 'anObject'はポインタなので、私はちょっと混乱しています。ポインタを使用しているので、コード内のどこでも値を更新できます。 – Paul
@Paulまた、 'observeValueForKeyPath:'の実装を表示する必要があります – hamstergene