NSDictionary:objectForKey返回nil,即使键在字典中

时间:2012-10-29 10:38:02

标签: iphone ios

使用NSDictionnary时我遇到了一个奇怪的问题...

我正在尝试使用方法objectForKey检索存在的键的对象是字典,但它返回nil。

当我打印出整个词典时,我可以清楚地看到我正在寻找的关键和价值。

以下是代码:

- (MObject *)GetWithMProperty:(MProperty *)prop {
    NSLog(@"We search an object for a property named %@", prop.Name);
    NSArray *keyArray =  [_dict allKeys];
    int count = [keyArray count];
    for (int i=0; i < count; i++) {
        MObject *tmp = [_dict objectForKey:[ keyArray objectAtIndex:i]];
        NSLog(@"Key = %@ | Object = %d", ((MProperty*)[keyArray objectAtIndex:i]).Name, tmp.GetTypeId);
        if (prop == [keyArray objectAtIndex:i])
            NSLog(@"Wouhou !");
        else
            NSLog(@"Too bad :(");
    }
    return [_dict objectForKey:prop];
}

堆栈跟踪:

2012-10-29 11:24:07.730 IOS6[1451:11303] We search an object for a property named Value
2012-10-29 11:24:07.730 IOS6[1451:11303] Key = Name | Object = 4
2012-10-29 11:24:07.731 IOS6[1451:11303] Too bad :(
2012-10-29 11:24:07.731 IOS6[1451:11303] Key = Value | Object = 0
2012-10-29 11:24:07.732 IOS6[1451:11303] Too bad :(

这有点复杂,我正在使用J2ObjC来编译一个功能齐全的引擎,因此我无法修改MProperty和MObject类(由引擎使用)。

MProperty不符合NSCopying协议,因此我创建了一个名为IPhoneMProperty的classe,它继承自MProperty并符合协议。

这是这堂课:

@implementation IPhoneMProperty

- (id)initWithMProperty:(MProperty *)prop {
    self = [super initWithInt:prop.OwnerTypeId withNSString:prop.Name withInt:prop.TypeId withMBasicValue:prop.DefaultValue withInt:prop.Flags];
    return self;
}

- (id)copyWithZone:(NSZone *)zone {
    IPhoneMProperty *prop = [[IPhoneMProperty alloc] initWithMProperty:self];
    return prop;
}

@end

我用来向dictionnary添加对象和键的方法:

- (void)SetWithMProperty:(MProperty *)prop withMObject:(MObject *)obj {
    IPhoneMProperty *tempKey = [[IPhoneMProperty alloc] initWithMProperty:prop];
    [_dict setObject:obj forKey:tempKey];
}

我希望它足够清楚,实际上它是我目前找到的唯一解决方案,但它不起作用:(

任何人都可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

中存在问题
    if (prop == [keyArray objectAtIndex:i])

而是在isEquals:课程中实施MProperty方法。

-(BOOL)isEquals:(MProperty*)inProp {
  if( [inProp.name isEqualToString:self.name] )return YES;

  return NO;
}

而且,在这里,而不是行

    if (prop == [keyArray objectAtIndex:i])

使用以下行

    if ([prop isEquals [keyArray objectAtIndex:i]])

答案 1 :(得分:0)

您在使用之前是否已分配_dict对象?

修改您的代码如下&amp;检查。

- (void)SetWithMProperty:(MProperty *)prop withMObject:(MObject *)obj {
    IPhoneMProperty *tempKey = [[IPhoneMProperty alloc] initWithMProperty:prop];
    if(!_dict) 
        _dict = [[NSMutableDictionay alloc]init];
    [_dict setObject:obj forKey:tempKey];
}

希望它适合你。

答案 2 :(得分:0)

您可以尝试更改if条件以比较字符串值吗?像这样:

if ([prop.Name isEqualToString:((MProperty*)[keyArray objectAtIndex:i]).Name])
            NSLog(@"Wouhou !");
        else
            NSLog(@"Too bad :(");
    }