views:

189

answers:

1

What does mean? I get this error when trying to iterate through a file in Cocoa obj-c.

I can't find any information on the web.

Would appreciate some help. Thanks.

EDIT

I've been following this tutorial (link) to preload Core Data. I've tried creating a Cococa application and have also tried doing this from within my iPhone app. I think all my setup code for Core Data is fine. Whenever this method is called I get EXEC BAD ACCESS.

- (void)loadInitialData
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // name ZSTREET_1   ZSTREET_2   ZCITY   ZZIP    ZURL    ZTEL    latitude    longitude

    NSString *path = [[NSBundle mainBundle] pathForResource:@"placesdata" ofType:@"txt"];

    NSString *fileString = [NSString stringWithContentsOfFile:path]; // reads file into memory as an NSString
    NSArray *lines = [fileString componentsSeparatedByString:@"\r"]; // each line, adjust character for line endings
    NSManagedObjectContext *context = [self managedObjectContext];
    for (NSString *line in lines)

    {   
        NSLog(line);

        NSString* string = [[NSString alloc] initWithUTF8String:line];
        NSArray *parts = [string componentsSeparatedByString:@"\t"];
        // value mapping
        NSString *name = [parts objectAtIndex:0];
        NSString *street_1 = [parts objectAtIndex:1];
        NSString *street_2 = [parts objectAtIndex:2];
        NSString *city = [parts objectAtIndex:3];
        NSString *zip = [parts objectAtIndex:4];
        NSString *url = [parts objectAtIndex:5];

        NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
        [f setNumberStyle:NSNumberFormatterDecimalStyle];

        NSNumber *latitude = [f numberFromString:[parts objectAtIndex:6]];
        NSNumber *longitude = [f numberFromString:[parts objectAtIndex:7]];
        [f release];
        // splitting the parts to create the objects

        Place *place = (Place *)[NSEntityDescription insertNewObjectForEntityForName:@"Place" inManagedObjectContext:context];
        Address *address = (Address *)[NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:context];
        Location *location = (Location *)[NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:context];

        // set attributes
        [place setValue:name forKey:@"name"];
        [address setValue:street_1 forKey:@"street_1"];
        [address setValue:street_2 forKey:@"street_2"];
        [address setValue:city forKey:@"city"];
        [address setValue:zip forKey:"@zip"];
        [address setValue:url forKey:@"url"];
        [location setValue:latitude forKey:@"latitude"];
        [location setValue:longitude forKey:@"longitude"];

        // link the objects together
        [place setValue:address forKey:@"address"];
        [place setValue:location forKeyPath:@"address.location"];

        [string release];
    }
    NSLog(@"Done initial load");
    NSError *error; 
    if (![context save:&error]) {
        NSLog(@"Error saving: %@", error);
    }
    [context release];
    [pool drain];


}
+1  A: 

This line is wrong and should produce a compiler warning:

NSString* string = [[NSString alloc] initWithUTF8String:line];

The method initWithUTF8String: expects an UTF-8 encoded C string and not a NSString object.

Before you continue you should fix all compiler warnings! And you also should check that the parts array actually contains as many objects as you expect. You also need to use a format string with NSLog, you might even crash there if your line contains any % characters.

Sven
apski: Moreover, if you already have an NSString object, you don't need to create an NSString object from it.
Peter Hosey