Iphone EXC_读取和写入plist文件时访问错误

Iphone EXC_读取和写入plist文件时访问错误,iphone,objective-c,Iphone,Objective C,我收到了大量与以下两个函数有关的EXC_BAD_访问错误,这两个函数用于读取和写入plist文件。我认为这与记忆有关。有什么建议吗 +(NSString *) getSettingString: (NSString *)key defaultValue:(NSString *)defValue { NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,

我收到了大量与以下两个函数有关的EXC_BAD_访问错误,这两个函数用于读取和写入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];
}

在第一种方法中,您不应释放
pathArray

NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[pathArray objectAtIndex:0] stringByAppendingFormat:@"FSSettings_v3.plist"];
[pathArray release];
NSSearchNSSearchPathForDirectoriesInDomains
返回自动删除的对象。 始终在XCode中执行“构建和分析”。它将告诉您许多保留/发布问题

也就是说,不要再发明轮子了。你可以用它。您的代码将变为四行:

+(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]
}
我将使用将默认值注册到
NSUserDefaults
,而不是将其提供给
-getSettingString

最后,您不应该以getter的名义放置
get
。这违反了客观C的习惯。
在Objective-C中,
get
通常仅在通过作为方法参数传入的指针返回结果时使用,如。

从调试配置开始,当它崩溃时将立即停止在正确的行。这将帮助您缩小它崩溃的原因以及涉及的变量。