使用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];
}
我希望它足够清楚,实际上它是我目前找到的唯一解决方案,但它不起作用:(
任何人都可以帮助我吗?
谢谢!
答案 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 :(");
}