代码之家  ›  专栏  ›  技术社区  ›  gabaum10

nsDictionary功能问题

  •  1
  • gabaum10  · 技术社区  · 14 年前

    所以我尝试将数组保存到一个动态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有一个“人”数组,它有关于一个人的一系列属性。我正设法编一本字典,按他们的商业名称分类。我通过创建一个数组并将其保存到字典中,并将业务名称作为键来完成此操作。循环的每次迭代我都会检查该键是否存在,如果存在,则拉出现有数组,添加要检查的人员,然后将其重新保存到字典中。然而,这似乎并没有发生。NSDictionary类中是否有一些异常行为会阻止这种情况发生?我翻阅了全班的网页,什么都找不到。抱歉,如果这是一个很难理解的问题,我仍然在努力理解Objective-C类。谢谢!

    4 回复  |  直到 14 年前
        1
  •  2
  •   kovpas    14 年前

    为什么要发布现有业务?您没有创建对象,只是从数组中获取指针。调用release时,retaincount变为0,对象释放。

    只需删除以下两行:

    [existingBusiness release];
    existingBusiness = nil;
    

    一切都会好起来的。

        2
  •  2
  •   jtbandes    14 年前

    你太过复杂了,更不用说泄露了一些东西了。

    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];
    }
    
        3
  •  1
  •   tc.    14 年前

    不是答案,而是一些编码风格的问题。

    如果不需要索引,请使用快速迭代:

    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:existingbusiness”调用除了浪费CPU周期之外什么都没有改变,但是在上面的例子中,它使代码更具可读性。

        4
  •  0
  •   eliego    14 年前
        [appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name];
    
        [existingBusiness release];
        existingBusiness = nil;
    

    所有这些都应该删除。现有的业务已经在字典中,它是一个可变的对象-当你在其中添加一个人时,这将反映在字典中,并且它是你正在处理的同一个对象。除此之外,正如丹尼尔指出的,你还有一些记忆泄漏。