2013-10-06 78 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块中包装了每个对observers(一个本地实例变量)的访问权限,以防万一有其他线程正在进行(没有)。

请查看我的代码(BSD许可证)并查看它,并帮助我理解这可能是什么。如果你愿意,我很乐意将这个程序与你配对,我是Twitter上的@niklassaers

+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

相关问题