2009-06-23 2 views
2

Erscheint die 3,0 NDA wurde aufgehoben, so sollte dies sicher zu stellen sein. Wenn dies gegen eine NDA verstößt, lass es mich wissen, damit ich den Beitrag nach der Eile entfernen kann.KVO auf dem iPhone auf 3.0 vs 2.2.1, mit einem Problem

Ich habe eine sehr triviale Implementierung für KVO auf einer NSOperationQueue. Mein Problem ist, dass ich beim Kompilieren mit 2.2.1 SDK unterschiedliche Ergebnisse für die betreffende NSOperationQueue für ein Gerät mit 3.0 oder eines mit 2.2.1 bekomme. Ich habe dies auf 1 iPod Touch, der 2.2.1, eine, die 3.0 hat, und zwei Sätze von iPhones mit ähnlichen Setups bestätigt.

Der Code sieht wie folgt aus:

// set observer 
[self.myOperationQueue addObserver:self forKeyPath:@"operations" options:NSKeyValueObservingOptionNew context:NULL]; 

// implementation 
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"operations"]) { 
     NSInteger operationCount = [[(NSOperationQueue*)object operations] count]; 
     NSArray *operations = [(NSOperationQueue*)object operations]; 
    } 
} 

Gemäß dem obigen Code, das Gerät 3.0 läuft die korrekte operationCount und die richtigen Operationen zurück. Ein Gerät, auf dem 2.2.1 ausgeführt wird, gibt immer nil für Operationen und 0 für operationCount zurück.

Ich kann nicht sagen, warum das der Fall ist. Alle Builds sind gegen 2.2.1 kompiliert.

HINWEIS

Gemäß Matts Antwort unten; "Objekt" ist null auf 2.2.1. Es ist nicht Null auf 3.0.

+0

Verwenden Sie NSLog(), um den Wert des Objekts zu überprüfen, nicht GDB. Ich bin auf ein seltsames Problem gestoßen, das für 2.2.1 mit dem Xcode 3.1.3 aufbaut: http://www.openradar.me/7017295 –

Antwort

1

Die Werte, die Sie erhalten klingen wie der object Parameter ist buchstäblich . Um die Quelle des Problems zu finden, möchten Sie vielleicht überprüfen, dass object und self.myOperationQueue den gleichen Wert haben - wenn sie dann Ihre self.myOperationQueue sind nur in einem seltsamen Zustand. Wenn sie nicht gleich sind, dann können Sie einfach von self.myOperationQueue anstelle von object lesen.

Sie verwenden jedoch die NSKeyValueObservingOptionNew Option, aber Sie lesen nicht den Wert, den es Ihnen gibt. Der Punkt von NSKeyValueObservingOptionNew ist, dass es den neuen Wert im Änderungswörterbuch übergibt.

heißt

// Inside the observe method 
NSArray *newOperationsArray = [change objectForKey:NSKeyValueChangeNewKey]; 

Wenn Sie den neuen Wert aus der Änderung Wörterbuch nicht extrahieren möchten, brauchen Sie nicht den NSKeyValueObservingOptionNew Wert zu übergeben (Sie können nur 0 passieren).

+0

Hey Matt, du hast ganz sicher Recht, wenn du vermutest, dass das Objekt null ist. Ich bin verwirrt, warum Objekt ist Null, wenn es auf einem 2.2.1-Gerät, aber nicht auf einem 3.0-Gerät ausgeführt wird .. – Coocoo4Cocoa