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 です。