在我的项目中,我正在使用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是一个字符串,其值与所选单元格中的文本相同(我已经测试过,它是准确的)。 如果可以的话,请帮助我....我会感恩的
答案 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...