开发者

Several Objective-C objects become Invalid for no reason, sometimes

开发者 https://www.devze.com 2022-12-26 01:58 出处:网络
- (void)loadLocations { NSString *url = @\"<URL to a text file>\"; NSStringEncoding enc = NSUTF8StringEncoding;
- (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."]);
        }
    }
}

There are a few weird things happening here. First, at the two lines where the NSArray lines is used, this message is printed to the console-

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

which is strange since lines is definitely not an NSMutableDictionary, definitely is initialized, and because the app doesn't crash.

Also, at random po开发者_高级运维ints in the loop, all of the variables that the debugger can see will become Invalid. Local variables, property variables, everything. Then after a couple lines they will go back to their original values. setObject:forKey never has an effect on res.locationCoords, which is an NSMutableDictionary. I'm sure that res, res.locationCoords, and byId are initialized.

I also tried adding a retain or copy to lines, same thing. I'm sure there's a basic memory management principle I'm missing here but I'm at a loss.


Your -[NSArray arrayWithObjects:] call must end with a nil (because a C function needs it to determine how many arguments you gave it).


I don't see anything obviously wrong with memory management here. Maybe add some error checking:

  • check the error: parameter of initWithContentsOfURL:
  • check locationString != nil
  • check lines != nil
0

精彩评论

暂无评论...
验证码 换一张
取 消