KVO на iPhone 3.0 против 2.2.1, возникла проблема

Похоже, что соглашение о неразглашении информации 3.0 было отменено, так что об этом можно смело спрашивать. Если это нарушает NDA, дайте мне знать, и я могу удалить сообщение после спешки.

У меня есть очень простая реализация KVO на NSOperationQueue. Моя проблема в том, что при компиляции с SDK 2.2.1 я получаю разные результаты для рассматриваемого NSOperationQueue для устройства, использующего 3.0, или устройства, использующего 2.2.1. Я подтвердил это на 1 iPod Touch с 2.2.1, на одном с 3.0 и на двух наборах iPhone с аналогичными настройками.

Код выглядит так:

// 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];
    }
}

Согласно приведенному выше коду, устройство под управлением версии 3.0 вернет правильный operationCount и правильные операции. Устройство, работающее под управлением 2.2.1, всегда будет возвращать nil для операций и 0 для operationCount.

Кажется, не могу понять, почему это так. Все сборки скомпилированы против 2.2.1.

ПРИМЕЧАНИЕ

Согласно ответу Мэтта ниже; 'объект' равен нулю в 2.2.1. Это не ноль на версии 3.0.


person Coocoo4Cocoa    schedule 23.06.2009    source источник
comment
Попробуйте использовать NSLog () для проверки значения объекта, а не GDB. Я столкнулся со странной проблемой при сборке 2.2.1 с Xcode 3.1.3: openradar.me/7017295 < / а>   -  person Martin Gordon    schedule 30.06.2009


Ответы (1)


Значения, которые вы получаете, звучат так, будто параметр object буквально равен nil. Чтобы найти источник проблемы, вы можете проверить, что object и self.myOperationQueue имеют одно и то же значение - если они совпадают, то ваш self.myOperationQueue находится в странном состоянии. Если они не равны, вы можете просто читать из self.myOperationQueue вместо object.

Однако вы используете параметр NSKeyValueObservingOptionNew, но не читаете то значение, которое он вам дает. Смысл NSKeyValueObservingOptionNew в том, что он передает новое значение в словарь изменений.

i.e.

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

Если вы не хотите извлекать новое значение из словаря изменений, вам не нужно передавать значение NSKeyValueObservingOptionNew (вы можете просто передать 0).

person Matt Gallagher    schedule 23.06.2009
comment
Привет, Мэтт, ты определенно прав, когда догадалась, что этот объект равен нулю. Я сбит с толку, почему объект равен нулю, когда он запущен на устройстве 2.2.1, но не на устройстве 3.0 .. - person Coocoo4Cocoa; 24.06.2009