2010-07-01 88 views
0

我收到了与读取和写入plist文件的以下两个函数相关的EXC_BAD_ACCESS错误。我认为它的记忆有关。有什么建议么?EXC_BAD_ACCESS读取和写入plist文件

+(NSString *) getSettingString: (NSString *)key defaultValue:(NSString *)defValue 
{ 
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[pathArray objectAtIndex:0] stringByAppendingFormat:@"FSSettings_v3.plist"]; 
    [pathArray release]; 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path]; 
    if (fileExists == YES) { 
     NSMutableDictionary* plistDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
     NSString *value = [plistDictionary objectForKey:key]; 
     return value; 
    } else { 
     [self setSettingString:key value:defValue]; 
     return defValue; 
    } 

} 

+(void) setSettingString: (NSString *)key value:(NSString *)value 
{ 
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [[pathArray objectAtIndex:0] stringByAppendingFormat:@"FSSettings_v3.plist"]; 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:path]; 
    if (fileExists == YES) { 
     NSMutableDictionary* plistDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:path]; 
     [plistDictionary setObject:value forKey:key]; 
     [plistDictionary writeToFile:path atomically:YES]; 
     [plistDictionary release]; 
    } else { 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
     [dict setObject:value forKey:key]; 
     [dict writeToFile:path atomically:YES]; 
     [dict release]; 
    } 
    [pathArray release]; 
} 
+0

从调试配置开始,它将在崩溃时立即停止在正确的行。这将帮助你缩小为什么它崩溃以及涉及哪个变量。 – Eiko 2010-07-01 21:14:59

回答

2

你不应该在第一种方法释放pathArray

NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *path = [[pathArray objectAtIndex:0] stringByAppendingFormat:@"FSSettings_v3.plist"]; 
[pathArray release]; 

NSSearchNSSearchPathForDirectoriesInDomains返回一个自动释放的对象。 总是在XCode中执行“Build & Analyze”。它会告诉你许多保留/释放问题。

这就是说,不要重新发明轮子。你可以使用NSUserDefaults。你的代码变得四行:

+(NSString *) settingString: (NSString *)key defaultValue:(NSString *)defValue 
{ 
     NSString*v=[[NSUserDefaults standardUserDefaults] stringForKey:key]; 
     if(v){ 
      return v; 
     }else{ 
      return defValue; 
     } 
} 

+(void) setSettingString: (NSString *)key value:(NSString *)value 
{ 
     [[NSUserDefaults standardUserDefaults] setObject:value forKey:key] 
} 

我会注册,而不是将其提供给-getSettingString默认使用registerDefaults:NSUserDefaults

最后,你不应该把get放在getter的名字里。这违背了Objective-C的习惯。 在Objective-C中,get通常仅在结果通过作为方法的参数传入的指针返回时才使用,如-[NSData getBytes:length:]中所述。