2011-02-18 5 views
0

이 코드를 사용하여 plist에서 데이터를로드했습니다.iPhone : 변수 범위 문제

-(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 메소드 외부에서 액세스 할 때 글꼴, 배경 및 애니메이션의 데이터를 사용할 수 없습니다. 변수 - 글꼴, 배경 및 애니메이션은 .h 파일의 NSString으로 선언되므로 전역 적으로 사용할 수 있어야합니다. 이 이유가 뭔지 말해 줄 수 있니?

답변

2

해당 개체를 보유해야합니다.

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"); 
} 
+0

글꼴, 배경, 애니메이션 인스턴스 변수가있는 경우에, 당신이 (당신이 쓴 같은)의 dealloc에서 그들을 석방해야합니다. 정적 전역 변수 인 경우 해제하지 마십시오. – Max

+0

고마워요. 그런데 왜 내가 이것을해야만 하는가? 죄송합니다, 임 아이폰 앱 개발에 새로운. –

+1

첫 번째 경우 (배열에서 값을 가져 오는 경우) 할당 후에 배열을 해제합니다. 배열을 해제하면 배열도 해제됩니다. 그래서 당신은 그들을 지켜야합니다. 두 번째 경우에는 객체가 자동으로 릴리즈됩니다. – Max