2010-02-06 65 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时,当您检索它时,它不可变。

我不确定你确切的问题,但这可能会让事情变得更容易。