【问题标题】:iPhone: Problem with scope of variablesiPhone:变量范围的问题
【发布时间】:2011-02-18 12:17:43
【问题描述】:

我已使用此代码从 plist 加载数据。

-(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,因此应该是全局可用的吧?你能告诉我这是什么原因吗?

【问题讨论】:

    标签: iphone plist scope


    【解决方案1】:

    你必须保留那些对象。

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

    【讨论】:

    • 如果字体、背景、动画是 ivars,那么你必须在 dealloc 中释放它们(就像你写的那样)。如果它们是静态全局变量,请不要释放它们。
    • 谢谢它的工作。但为什么我必须这样做?抱歉,我是 iphone 应用开发新手。
    • 在第一种情况下(当您从数组中获取值时)您在分配后释放数组。当您释放数组时,它也会释放它的对象。所以你必须保留它们。在第二种情况下,对象是自动释放的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2011-11-21
    • 2011-04-13
    • 2011-10-20
    • 2016-06-21
    • 2011-04-10
    • 2011-08-11
    相关资源
    最近更新 更多