有时,几个Objective-C对象无缘无故变为无效

时间:2010-04-06 20:24:37

标签: objective-c iphone

- (void)loadLocations {
    NSString *url = @"<URL to a text file>";
    NSStringEncoding enc = NSUTF8StringEncoding; 
    NSString *locationString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:url] usedEncoding:&enc error:nil];
    NSArray *lines = [locationString componentsSeparatedByString:@"\n"];

    for (int i=0; i<[lines count]; i++) {
        NSString *line = [lines objectAtIndex:i];
        NSArray *components = [line componentsSeparatedByString:@", "];
        Restaurant *res = [byID objectForKey:[components objectAtIndex:0]];

        if (res) {
            NSString *resAddress = [components objectAtIndex:3];
            NSArray *loc = [NSArray arrayWithObjects:[components objectAtIndex:1], [components objectAtIndex:2]];
            [res.locationCoords setObject:loc forKey:resAddress];   
        }
        else {
            NSLog([[components objectAtIndex:0] stringByAppendingString:@" res id not found."]);
        }
    }
}

这里发生了一些奇怪的事情。首先,在使用NSArray行的两行中,此消息将打印到控制台 -

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFDictionary count]: method sent to an uninitialized mutable dictionary object'

这很奇怪,因为lines绝对不是NSMutableDictionary,肯定是初始化的,因为应用程序不会崩溃。

此外,在循环中的随机点,调试器可以看到的所有变量都将变为无效。局部变量,属性变量,一切。然后经过几行后,他们将回到原来的价值观。 setObject:forKey永远不会对res.locationCoords产生影响,它是一个NSMutableDictionary。我确定res,res.locationCoords和byId已初始化。

我也试过在行中添加一个保留或副本,同样的事情。我确信这里有一个基本的内存管理原则,但我不知所措。

2 个答案:

答案 0 :(得分:2)

您的-[NSArray arrayWithObjects:]调用必须以nil结尾(因为C函数需要它来确定您给出的参数数量)。

答案 1 :(得分:1)

我没有看到内存管理明显错误。也许添加一些错误检查:

  • 检查错误:initWithContentsOfURL的参数:
  • 检查locationString!= nil
  • 检查行!= nil