0

https://github.com/niklassaers/NJSNotificationCenterにプロジェクトがあり、これまでのところ 2 つの単体テストしかありません。そのうちの 1 つが実行され、そのうちの 1 つが 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 に答える