2010-07-01 129 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:]中所述。