2010-02-06 42 views
1

我有一個在程序加載時創建的NSMutableArray。如果程序終止,我將數組保存到一個文件中。然後,當應用程序再次啓動時,我檢查該文件是否存在,如果存在,請將其作爲數組讀取。NSMutableArray字符串從文件中讀入後發生變化

問題是,在第一次創建時一切都很好,我檢查一個數組對象是否對應某個字符串,如果它相等,則執行一些操作。這工作很好,第一次去。但是,如果我從罰款中讀回數組,並且做相同的比較,即使它們都表示它們是相同的,但它並不這麼認爲,並且跳過了這個過程。代碼示例:

這是如果該文件不存在,從頭開始創建:

NSMutableArray *tmpArray=[[NSMutableArray alloc] initWithObjects: 
          @"1000", 
          @"1000", 
          @"1000", 
          @"500", 
          @"500", 
          @"500", 
          @"250", 
          @"250", 
          @"250", 
          @"100", 
          @"100", 
          @"100", 
          @"100", 
          @"TRIPLE", 
          @"TRIPLE", 
          @"DOUBLE", 
          @"DOUBLE", 
          @"- 500", 
          @"- 250", 
          @" - 250", 
          @"- 100", 
          @"- 100", 
          @"HALF", 
          @"BUST", 
          nil]; 

如果文件不存在:

pnames = [[NSMutableArray alloc] initWithContentsOfFile:myPath]; 

這裏就是比較進來:

NSString *strInfo; 

strInfo = [pnames objectAtIndex: theInteger - 1]; 
NSLog(@"strInfo: %@", strInfo); 
if (strInfo == @"DOUBLE") 
{ 
    //do something 
} 

就像我說過的,這個比較在第一次創建時工作得很好,但是當數組通過文件加載時沒有問題。

編寫出該文件是通過做:

(void)applicationWillTerminate:(UIApplication *)application { 
[pnames writeToFile:[self saveFilePath] atomically:YES]; 

} 

當我在調試器看strInfo(從上面),它顯示爲:

NSCFString - 0c8168 - DOUBLE ---從創作,並沒有認識到它作爲平等

NSCFString - 0x3d42af0 - DOUBLE ---當它沒有認識到它作爲平等的,通過文件加載

對此有何見解爲g非常感謝。

地理...

回答

5
if (strInfo == @"DOUBLE") 
{ 
    //do something 
} 

你不能比較使用== NSString的情況下,你需要使用-isEqualToString:

if ([strInfo isEqualToString: @"DOUBLE"]) { ... } 

它發生在第一次創建工作,因爲所有的字符串值被編譯到您的應用程序爲常量字符串,因此,該@「DOUBLE」,也就是你的數組中恰好是在與比較的@「DOUBLE」相同的地址處。

當從「磁盤」讀取數組時,會分配新的字符串。

+0

哦,呃 - 哈哈我應該得到的。好的答案+1 – 2010-02-06 23:25:36

+0

它在第一次加載時是一個微妙的陷阱(現在解釋)。不客氣! – bbum 2010-02-06 23:34:02

0

我不知道如果你只是將這個NSString保存到NSUserDefaults,你會有一個更容易的時間。請記住,當您將可變字符串保存到NSUserDefaults時,當您檢索它時,它不可變。

我不確定你確切的問題,但這可能會讓事情變得更容易。

相關問題