0

我在https://github.com/niklassaers/NJSNotificationCenter有一个项目,到目前为止只有两个单元测试。其中一个运行,其中一个运行 60% 的时间。剩下的 40% 的时间,它会失败,因为我的 NSMutableValue 包含一个 nil 值,即使我从来没有输入一个 nil 值(也不应该这样做)

问题出现在这里:

- (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!");
    }
}

我创建一个键,它不是 nil,我创建一个值,它不是 nil,我将它添加到我的字典并从字典中取回它,但现在它是 nil!这对我来说毫无意义。

我已经将所有对观察者的访问(一个本地实例变量)包装在一个 @synchronized 块中,以防万一有任何其他线程正在进行(没有)。

请查看我的代码(BSD 许可证)并查看它,并帮助我了解这是怎么回事。如果你愿意,我很想和你一起做这个程序,我是 Twitter 上的@niklassaers

4

1 回答 1

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

字典正在复制您的键对象并存储它 - 当它尝试查找原始键对象时,它没有找到它,因为哈希值不匹配。

于 2013-10-06T21:50:44.513 回答