2013-10-06 1 views
0

У меня есть проект на https://github.com/niklassaers/NJSNotificationCenter, пока только два модульных теста. Один из них работает, один из них работает в 60% случаев. Оставшиеся 40% времени, это не получится, потому что мой NSMutableValue содержит ноль значение, даже если я никогда не ставил в нулевой стоимости (ни это должно быть возможно)NSMutableDictionary с нолем как значение

Проблема возникает здесь:

- (void) addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject priority:(NSInteger)priority { 
    NJSNotificationKey *key = [[NJSNotificationKey alloc] initWithObserver:observer name:aName object:anObject]; 
    NSLog(@"Key is: %p", key); 
    key.priority = priority; 
    NJSNotificationValue *value = [[NJSNotificationValue alloc] initWithSelector:aSelector]; 
    NSAssert(value, @"Value cannot be nil!"); 
    @synchronized(observers) { 
     observers[key] = value; 
     NSLog(@"Key: %p\tValue: %p\t%@", key, value, observers); 
     if(observers[key] == nil) 
      NSLog(@"This can't be!"); 
    } 
} 

Я делаю ключ, это не ноль, я делаю значение, это не ноль, я добавляю его в словарь и возвращаю его из словаря, но теперь это нуль! Для меня это не имеет смысла.

Я закрыл каждый доступ к наблюдателям (локальной переменной экземпляра) в блоке @synchronized только в том случае, если произошла какая-либо другая потоковая передача (нет).

Пожалуйста, проверьте мой код (лицензия BSD) и посмотрите на него и помогите мне понять, как это может быть. Если вы хотите, я бы с удовольствием сыграл с вами пару программ, я @niklassaers на Twitter

+0

Вы действительно создаете экземпляр словаря? –

+0

Я сомневаюсь в этом фрагменте строки: NJSNotificationValue * value = [[NJSNotificationValue alloc] initWithSelector: aSelector]; – yunas

+0

@ColinMorelli: Я, наблюдатели не ноль. Если вы посмотрите в методе init, он создается там. – niklassaers

ответ

4

Вы не реализовали хэш.

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/Collections/Articles/Dictionaries.html#//apple_ref/doc/uid/20000134-SW8 

Keys must implement the hash and isEqual: methods because a dictionary 
uses a hash table to organize its storage and to quickly access contained 
objects 

Словарь копирует свой основной объект и хранения, которые - при попытке для поиска оригинального ключа объекта, он не находит, поскольку хэш-значения не совпадают.

+0

Спасибо ОЧЕНЬ много! :-) Я не заметил эту часть документации, только чтобы она соответствовала NSCopying. С хеш-функцией на месте, мои тесты работают нормально. :-) Еще раз спасибо! – niklassaers

 Смежные вопросы

  • Нет связанных вопросов^_^