Далее, в вашем коде:
NSString *URLforAll = [[NSString alloc] init];
Это никогда не имеет смысла. Вот несколько вопросов:
- Вы выделили объект, который затем беспорядочно перезаписали на
URLforAll = [dict objectForKey:@"URL"];
. Так что вам нужно будет выпустить его перед перезаписью.
- Он выделен (т. Е. В конце цикла вы «владеете» им и должны будете его освободить.
[dict objectForKey:@"URL"]
возвращает объект, которым вы не владеете. Поэтому в конце цикла вы не знаете, являетесь ли вы владельцем URL для всех или нет.
- И, наконец,
[[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 = @"";
}
- лучшее решение, но вы должны решить, что не так с вашим исходным решением.