ObjectForKey 有时返回 nil
ObjectForKey is returning nil sometimes
我正在尝试将对象设置为以键为对象的字典。测试用例工作正常,但在实际代码中,我无法获取键的值。 NSMutableDictionary
里面有键值,但是调试的时候returnsnil
.
@implementation JSHashMap {
NSMutableDictionary *dict;
}
- (instancetype)initWithArray:(NSMutableArray *)array {
self = [super init];
if (self) {
dict = [self fromArray:array];
}
return self;
}
- (NSMutableDictionary *)fromArray:(NSMutableArray *)array {
NSMutableDictionary* _dict = [NSMutableDictionary new];
NSUInteger i = 0, len = [array count];
if (len % 2 != 0) {
error(@"JSError: Odd number of elements in the array.");
return _dict;
}
for (i = 0; i < len; i = i + 2) {
[_dict setObject:array[i + 1] forKey:array[i]];
assert([_dict objectForKey:array[i]] != nil);
}
debug(@"%@", _dict);
return _dict;
}
- (JSData *)objectForKey:(id)key {
return [dict objectForKey:key];
}
我正在使用 initWithArray
方法创建哈希映射。
(lldb) po [dict objectForKey:key]
nil
传入的key
和字典中的key内存地址相同0x100ea2fa0
.
虽然测试用例工作正常。但是当 运行 实际程序时,它失败了。
NSMutableDictionary *dict = [NSMutableDictionary new];
JSNumber *val = [[JSNumber alloc] initWithInt:1];
JSNumber *key = [[JSNumber alloc] initWithInt:2];
[dict setObject:val forKey:key];
JSData * ret = [dict objectForKey:key];
XCTAssertNotNil(ret);
XCTAssertEqualObjects([ret dataType], @"JSNumber");
JSHashMap *hm = [[JSHashMap alloc] initWithArray:[@[key, val] mutableCopy]];
JSData * ret1 = [hm objectForKey:key];
XCTAssertNotNil(ret1);
XCTAssertEqualObjects([ret1 dataType], @"JSNumber");
JSHashMap *dict = (JSHashMap *)ast;
NSArray *keys = [dict allKeys];
NSUInteger i = 0;
NSUInteger len = [keys count];
for (i = 0; i < len; i++) {
id key = keys[i];
JSData *val = (JSData *)[dict objectForKey:key];
// Issue -> val is getting nil
}
如何解决这个问题,为什么会出现这种随机行为?
找到失败的测试用例。
NSArray *keys = [hm allKeys];
XCTAssertTrue([keys count] == 1);
JSData *ret = [hm objectForKey:keys[0]];
XCTAssertNotNil(ret);
如果我使用调用 allKeys
方法返回的密钥,它 returns nil。
您没有显示任何关于 JSNumber 是什么的信息,但我敢打赌它没有正确实现 isEqual
和 hash
。因此,您不能成功地将它用作 NSDictionary 中的键。
我正在尝试将对象设置为以键为对象的字典。测试用例工作正常,但在实际代码中,我无法获取键的值。 NSMutableDictionary
里面有键值,但是调试的时候returnsnil
.
@implementation JSHashMap {
NSMutableDictionary *dict;
}
- (instancetype)initWithArray:(NSMutableArray *)array {
self = [super init];
if (self) {
dict = [self fromArray:array];
}
return self;
}
- (NSMutableDictionary *)fromArray:(NSMutableArray *)array {
NSMutableDictionary* _dict = [NSMutableDictionary new];
NSUInteger i = 0, len = [array count];
if (len % 2 != 0) {
error(@"JSError: Odd number of elements in the array.");
return _dict;
}
for (i = 0; i < len; i = i + 2) {
[_dict setObject:array[i + 1] forKey:array[i]];
assert([_dict objectForKey:array[i]] != nil);
}
debug(@"%@", _dict);
return _dict;
}
- (JSData *)objectForKey:(id)key {
return [dict objectForKey:key];
}
我正在使用 initWithArray
方法创建哈希映射。
(lldb) po [dict objectForKey:key]
nil
传入的key
和字典中的key内存地址相同0x100ea2fa0
.
虽然测试用例工作正常。但是当 运行 实际程序时,它失败了。
NSMutableDictionary *dict = [NSMutableDictionary new];
JSNumber *val = [[JSNumber alloc] initWithInt:1];
JSNumber *key = [[JSNumber alloc] initWithInt:2];
[dict setObject:val forKey:key];
JSData * ret = [dict objectForKey:key];
XCTAssertNotNil(ret);
XCTAssertEqualObjects([ret dataType], @"JSNumber");
JSHashMap *hm = [[JSHashMap alloc] initWithArray:[@[key, val] mutableCopy]];
JSData * ret1 = [hm objectForKey:key];
XCTAssertNotNil(ret1);
XCTAssertEqualObjects([ret1 dataType], @"JSNumber");
JSHashMap *dict = (JSHashMap *)ast;
NSArray *keys = [dict allKeys];
NSUInteger i = 0;
NSUInteger len = [keys count];
for (i = 0; i < len; i++) {
id key = keys[i];
JSData *val = (JSData *)[dict objectForKey:key];
// Issue -> val is getting nil
}
如何解决这个问题,为什么会出现这种随机行为?
找到失败的测试用例。
NSArray *keys = [hm allKeys];
XCTAssertTrue([keys count] == 1);
JSData *ret = [hm objectForKey:keys[0]];
XCTAssertNotNil(ret);
如果我使用调用 allKeys
方法返回的密钥,它 returns nil。
您没有显示任何关于 JSNumber 是什么的信息,但我敢打赌它没有正确实现 isEqual
和 hash
。因此,您不能成功地将它用作 NSDictionary 中的键。