- (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已初始化。
我也试过在行中添加一个保留或副本,同样的事情。我确信这里有一个基本的内存管理原则,但我不知所措。
答案 0 :(得分:2)
您的-[NSArray arrayWithObjects:]
调用必须以nil
结尾(因为C函数需要它来确定您给出的参数数量)。
答案 1 :(得分:1)
我没有看到内存管理明显错误。也许添加一些错误检查: