Чтение ключей NSDictionary из списков свойств - PullRequest
2 голосов
/ 21 июня 2009

В моем проекте я использую PropertyList для ведения данных. файл plist называется «DataBase.plist». Root for DataBase.plist - это словарь, который содержит 5 словарей в качестве дочерних элементов ... теперь вложенный словарь содержит 4 строки, из которых всегда есть веб-адрес с ключом "URL" (без кавычек) .... я запускаю следующий код для извлечения значения для этого 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"];
    }
}

строка - это строка, значение которой совпадает с текстом в выбранной ячейке (я проверял, это точно). Пожалуйста, помогите мне, если можете .... я буду благодарен

Ответы [ 3 ]

3 голосов
/ 22 июня 2009

Далее, в вашем коде:

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 = @"";
}

- лучшее решение, но вы должны решить, что не так с вашим исходным решением.

3 голосов
/ 21 июня 2009

Попробуйте использовать [key isEqualToString: rowString] вместо сравнения key и rowString напрямую, используя ==. Я думаю, == сравнивает значения указателя объекта, которые не будут равны, даже если строки совпадают.

Кроме того, просто не нужно инициализировать URLforAll перед его настройкой. Когда вы установите его равным [dict objectForKey:@"URL"], вы потеряете указатель на объект, который вы уже создали, и он будет утек. Вместо этого просто скажите NSString *URLforAll = nil; или создайте новую строку и autorelease, чтобы объект автоматически очищался:

NSString * URLforAll = [[[NSString alloc] init] autorelease];
2 голосов
/ 21 июня 2009

Вам также не нужно перебирать словарь. Просто спросите, какие данные вам нужны.

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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...