Подтвердить что ты не робот

Предупреждение: попытка создать переменную USE_BLOCK_IN_FRAME с блоком, который не находится в кадре

Что значит? Я получаю эту ошибку при попытке выполнить итерацию через файл в Cocoa obj-c.

Я не могу найти какую-либо информацию в Интернете.

Поблагодарили бы за помощь. Благодарю.

ИЗМЕНИТЬ

Я читал этот учебник (link) для предварительной загрузки Core Data. Я пробовал создать приложение Cococa, а также попытался сделать это из своего iPhone-приложения. Я думаю, что весь мой установочный код для Core Data прекрасен. Всякий раз, когда этот метод называется, я получаю 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];


}
4b9b3361

Ответ 1

Эта строка неверна и должна вызывать предупреждение компилятора:

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

Метод initWithUTF8String: ожидает кодированную строкой C UTF-8, а не объект NSString.

Прежде чем продолжить, вы должны исправить предупреждения all компилятора! И вы также должны убедиться, что массив parts фактически содержит столько объектов, сколько вы ожидаете. Вам также нужно использовать строку формата с NSLog, вы можете даже столкнуться там, если ваша строка содержит любые символы %.

Ответ 2

Для других людей, сталкивающихся с этой проблемой с совершенно другим кодом, это немного красная селедка.

Предупреждение из самого отладчика. Отладчик создает структуру, содержащую информацию для каждого объекта в системе. После EXC_BAD_ACCESS он попытался создать один из них, но не смог. Обратите внимание, что это предупреждение, а не ошибка, поэтому его можно даже ожидать в таких ситуациях.

В любом случае детали, окружающие это, не имеют значения. Вы должны найти источник своего EXC_BAD_ACCESS. Общей причиной является попытка получить доступ к объекту после его освобождения.

Ответ 3

Для тех, кто сталкивается с этим в будущем, у меня возникла эта проблема, потому что я делал это слишком много:

NSString* aString = @"";

for(int i=0; i<someLargeNumber; i++) {
    aString = [aString stringByAppendingFormat:@"..."];
}

Как только я переключился на использование NSMutableString, проблема была решена.

Ответ 4

Я встречаюсь с EXC_BAD_ACCESS довольно регулярно (что не очень хорошо), потому что мы еще не включили ARC.

Я нахожу лучший способ отслеживать эти ошибки, используя Profiler в модусе Zombie. Это сообщение показывает вам, как "охотиться за зомби":

Как настроить NSZombieEnabled в Xcode 4?