iPhone: проблема с областью действия переменных - PullRequest
0 голосов
/ 18 февраля 2011

Я использовал этот код для загрузки данных из списка.

-(void)loadOrCreateData {
    NSLog(@"Start loadOrCreateData");
    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    {
        NSLog(@"File Exists.. Loading from plist File");
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
        font = [array objectAtIndex:0];
        background = (NSString *)[array objectAtIndex:1];
        animation = [array objectAtIndex:5];
        [array release];
        NSLog(@"Loading Done!");
    }
    else 
    {
        NSLog(@"File does not exist.. Creating new plist File");
        font = @"Georgia-BoldItalic";
        background = @"monalisa.jpeg";
        animation = @"103";
        [self saveData];
    }

    NSLog(@"Finish loadOrCreateData");
}

- (NSString *)dataFilePath {
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];
   return [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
}

- (void)saveData {
   NSMutableArray *array = [[NSMutableArray alloc] init];
   [array addObject:font];
   [array addObject:background];
   [array addObject:animation];
   [array writeToFile:[self dataFilePath] atomically:YES];
   [array release];
}

В первый раз все загружается нормально, когда нет файла plist для получения данных. Но при второй загрузке приложение вылетает, когда я пытаюсь использовать загруженные данные вне метода loadOrCreate. По какой-то причине данные в шрифте, фоне и анимации недоступны при доступе вне метода loadOrCreate. Переменные - шрифт, фон и анимация объявлены как NSStrings в файле .h и поэтому должны быть доступны глобально, верно? Подскажите, пожалуйста, в чем причина?

1 Ответ

2 голосов
/ 18 февраля 2011

Вы должны сохранить эти объекты.

    font = [[array objectAtIndex:0] retain];
    background = (NSString *)[[array objectAtIndex:1] retain];
    animation = [[array objectAtIndex:5] retain];
...
    font = [@"Georgia-BoldItalic" retain];
    background = [@"monalisa.jpeg" retain];
    animation = [@"103" retain];

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

Редактировать:

-(void)loadOrCreateData {
    [font release];
    [background release];
    [animation release];

    NSLog(@"Start loadOrCreateData");
    NSString *filePath = [self dataFilePath];
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
    {
        NSLog(@"File Exists.. Loading from plist File");
        NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
        font = [[array objectAtIndex:0] retain];
        background = (NSString *)[[array objectAtIndex:1] retain];
        animation = [[array objectAtIndex:5] retain];
        [array release];
        NSLog(@"Loading Done!");
    }
    else 
    {
        NSLog(@"File does not exist.. Creating new plist File");
        font = [@"Georgia-BoldItalic" retain];
        background = [@"monalisa.jpeg" retain];
        animation = [@"103" retain];
        [self saveData];
    }

    NSLog(@"Finish loadOrCreateData");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...