NSDictionary функциональный вопрос - PullRequest
1 голос
/ 18 августа 2010

Итак, я пытаюсь сохранить массивы в NSDictionary на лету.Позвольте мне показать вам код и объяснить, что происходит.

for (int x= 0; x <[appDelegate.people count]; x++) {
    Person *aPerson = [[Person alloc] init];
    aPerson = [appDelegate.people objectAtIndex:x];
    if ([appDelegate.groupedBusiness objectForKey:aPerson.business_name] == nil) {
        NSMutableArray *newBusiness = [[NSMutableArray alloc] init];
        //if the business does not exist in the dict, add the person to the business and add it to dict.

                    [newBusiness addObject:aPerson];

        [appDelegate.groupedBusiness setObject:newBusiness forKey:aPerson.business_name];

        [newBusiness release];
        newBusiness = nil;
        //NSLog(@"%@", appDelegate.groupedBusiness);
    } else {
        NSMutableArray *existingBusiness= [appDelegate.groupedBusiness objectForKey:aPerson.business_name];
        [existingBusiness addObject:aPerson];
                  //THIS IS THE LINE I AM NOT SURE ABOUT!!!
        [appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];

        [existingBusiness release];
        existingBusiness = nil;
        //NSLog(@"%@", appDelegate.groupedBusiness);
    }

}

Хорошо, поэтому appDelegate имеет массив «Люди», который имеет целый ряд атрибутов о человеке.Я пытаюсь настроить словарь, чтобы отсортировать их по названиям компаний.Я делаю это, создавая массив и сохраняя его в словаре с ключом business_name.На каждой итерации цикла я проверяю, существует ли ключ, если он существует, извлекает существующий массив, добавляет проверяемого человека и сохраняет его в словаре.Однако этого, похоже, не происходит.Есть ли какое-то экзотическое поведение в классе NSDictionary, которое могло бы предотвратить это?Я залил веб-страницу класса и ничего не могу найти.Извините, если это вопрос нуби, я все еще пытаюсь понять классы target-c.Спасибо!

Ответы [ 4 ]

2 голосов
/ 18 августа 2010

Вы слишком усложняете это, не говоря уже о том, чтобы пропустить пару вещей.

for (Person *aPerson in appDelegate.people) {
    NSMutableArray *business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name];
    if (!business) {
        business = [NSMutableArray array];
        [appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];
    }

    [business addObject:aPerson];
}
2 голосов
/ 18 августа 2010

Почему вы выпускаете существующий бизнес? Вы не создаете объект, просто берете указатель из массива. Когда вы вызываете release, retainCount становится 0, а объект освобождается.

Просто удалите следующие две строки:

[existingBusiness release];
existingBusiness = nil;

и все должно работать нормально.

1 голос
/ 19 августа 2010

Не ответ, но некоторые проблемы со стилем кодирования.

Используйте быструю итерацию, если вам не нужен индекс:

for (Person *aPerson in appDelegate.people) {

Используйте удобные конструкторы; это делает ваш код более читабельным (не забудьте удалить «release» в конце):

NSMutableArray *newBusiness = [NSMutableArray arrayWithObject:aPerson];

Избегайте дублирования логики, где это возможно:

NSMutableArray * business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name;
if (!business) {
  business = [NSMutableArray array];
}
[business addObject:aPerson];
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name];

Вызов setObject: существующиеBusiness ничего не меняет, кроме траты циклов ЦП, но в приведенном выше случае код становится более читабельным.

0 голосов
/ 18 августа 2010
    [appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];

    [existingBusiness release];
    existingBusiness = nil;

Это все должно быть удалено.Существующий бизнес уже в поле зрения, и это изменчивый объект - когда вы добавляете в него человека, это отражается в словаре, а также в том же объекте, с которым вы имеете дело.Кроме того, как указывает Дэниел, у вас есть пара утечек памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...