2012-04-01 13 views
0

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]; 
} 
+0

あなたは実際にそのコードで何が起こると思われますか?あなたが提供したことから、トラッカーオブジェクトは、印刷されるときに「緯度」の値が同じになると思います。あなたはKVOについて言及していますが、このコードでは使用していません。 –

+0

@ Paul.s:ええ、私の投稿を編集しましたが、私の質問は「なぜ」ポインタがちょうど十分な値を変更しないのですか?実際には同じ値ですが、 'anObject'はポインタなので、私はちょっと混乱しています。ポインタを使用しているので、コード内のどこでも値を更新できます。 – Paul

+0

@Paulまた、 'observeValueForKeyPath:'の実装を表示する必要があります – hamstergene

答えて

0

あなたのiVarsを合成するのを忘れたようですか?

@implementation Position 

@synthesize latitude, longitude, altitude; 

... 

@end 
+0

あなたの答えはmoosgummiに感謝していますが、実際には合成されていませんでした(私はここにオブジェクト全体をコピーして貼り付けませんでした)が、一般的なルールとしてポインタが変数を更新するのに十分でない理由は不思議でした。 – Paul

関連する問題