从属性列表中读取NSDictionary键

时间:2009-06-21 04:05:38

标签: objective-c cocoa dictionary

在我的项目中,我正在使用propertyList来维护数据。 plist文件名为“DataBase.plist”。 Root for DataBase.plist是一个包含5个字典作为子项的字典...现在子字典包含4个字符串,其中一个字符串总是带有键“URL”的webaddress(没有引号).... 我正在运行以下代码来提取此URL密钥的值,但它没有用...

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"plist"];
NSDictionary *rootDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSString *URLforAll = [[NSString alloc] init];
for (id key in rootDict)
{
    if(key == rowString)
    {
        NSDictionary *dict = [rootDict objectForKey:key];
        URLforAll = [dict objectForKey:@"URL"];
    }
}

rowstring是一个字符串,其值与所选单元格中的文本相同(我已经测试过,它是准确的)。 如果可以的话,请帮助我....我会感恩的

3 个答案:

答案 0 :(得分:3)

尝试使用[key isEqualToString: rowString]而不是直接使用==比较key和rowString。我认为==会比较对象的指针值,即使字符串匹配也不会相等。

另外 - 另外,在设置之前,您不需要初始化URLforAll。当您将其设置为[dict objectForKey:@"URL"]时,您将丢失指向您已创建的对象的指针,并且它将被泄露。相反,只需说NSString *URLforAll = nil;或创建一个新字符串autorelease,以便自动清理对象:

NSString * URLforAll = [[[NSString alloc] init] autorelease];

答案 1 :(得分:3)

此外,在您的代码中:

NSString *URLforAll = [[NSString alloc] init];

这从未有过感官。以下是一些问题:

  • 您分配了一个对象,然后您使用URLforAll = [dict objectForKey:@"URL"];进行异地覆盖。所以你需要在覆盖它之前释放它。
  • 它被分配(即,在循环结束时,你“拥有”它并且必须释放它。但是 [dict objectForKey:@"URL"]返回您不拥有的对象。所以在循环结束时,你不知道你是否拥有URLforAll。
  • 最后,[[NSString alloc] init]永远不会有意义,因为您应该使用@"",它会返回一个不变NSString问题的常量空retain/release/autorelease

处理isEqualToString问题,但忽略了amrox更好的解决方案,代码将是:

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"plist"];
NSDictionary *rootDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSString *URLforAll = @"";
for (id key in rootDict) {
        if ( [key isEqualToString:rowString] ) {
                NSDictionary *dict = [rootDict objectForKey:key];
                URLforAll = [dict objectForKey:@"URL"];
        }
}
[[URLforAll retain] autorelease];
[rootDict release];

请注意,objectForKey可能会返回对象的内部引用,当您释放字典时,该引用将变为无效,因此如果您希望保留对象的时间长于字典的生命周期,则需要保留该对象

amrox使用:

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"plist"];
NSDictionary *rootDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSString *URLString = [[rootDict objectForKey:key] objectForKey:@"URL"];
[[URLString retain] autorelease];
[rootDict release];
if ( !URLString ) {
    URLString = @"";
}

是一个更好的解决方案,但您也应该对原始解决方案的问题进行处理。

答案 2 :(得分:2)

您也不需要遍历字典。只需询问您想要的数据。

NSString *path = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"plist"];
NSDictionary *rootDict = [[[NSDictionary alloc] initWithContentsOfFile:path] autorelease];
NNSString *URLString = [[rootDict objectForKey:key] objectForKey:@"URL"];

// do something or return  URLString...