2011-02-18 114 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文件中声明为NSStrings,因此应该是全局可用的吗?你能告诉我这是什么原因吗?

回答

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 2011-02-18 04:16:15