2010-09-30 84 views
0

我使用的是NSDictionary从与下面的代码的plist得到了NSString iPhone应用:的NSString问题的

NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"TestIds" ofType:@"plist"]; 
NSDictionary *dictionary = [[NSDictionary dictionaryWithContentsOfFile:fullPath] retain]; 
NSString *testid = [dictionary objectForKey:@"testId"]; 

,然后我把它保存在一个NSMutableArray与我创建了一个类的对象:

// before the code above 
NSMutableArray *array = [[NSMutableArray array] retain]; // this is actually a global variable 

// after the code 
IdDescription *idDesc = [[IdDescription alloc] initWithId:testid]; 
[array addObject:idDesc]; 

应用做一些东西,其他的事情,然后调用它调用NSString的方法:

IdDescription *desc = [array objectAtIndex:n]; 
NSLog(@"%@", desc.testId); // testId is a property with retain 

问题是应用程序崩溃或被中断以及所有类型的事情,当它到达NSLog行。最难得的是,它的工作原理,如果我改变行:

NSString *testid = [dictionary objectForKey:@"testId"]; 

为:

NSString *testid = @"testId_1"; // or any other string 

我测试加:

if ([testid compare:@"testId_1"] == NSOrderedSame) 
    testid = @"testId_1"; 

NSString *testid = [dictionary objectForKey:@"testId"] 

它仍然有效。

我也使用

NSString *testid = [NSString stringWithFormat:@"testId_%d", 1] 

,而不是麻烦的线尝试,但它与同EXC_BAD_ACCESS错误崩溃。

任何人都知道可能是什么问题?我尝试了几乎所有的东西。任何帮助最受赞赏。

+0

供参考:如果您缩进代码四个空格,它将显示在等宽字体和语法突出显示,所以它更容易阅读:) – 2010-09-30 05:52:17

+0

请格式化您的代码,使其更具可读性。有关指导,请参阅[Markdown编辑帮助](http://stackoverflow.com/editing-help)。 – 2010-09-30 05:53:49

+0

如果您在NSString * testid = [dictionary objectForKey:@“testId”]后执行NSLog(@“%@”,testid),它会崩溃吗?线?调试器和控制台在崩溃后显示什么? – Altealice 2010-09-30 06:21:58

回答

1

我发现这个问题。在行 NSString * testid = [dictionary objectForKey:@“testId”]; 我不得不将它更改为 NSString * testid = [[dictionary objectForKey:@“testId”] copy];因为在收集完所有信息后,NSData对象被释放。

0
NSString *testid = [dictionary objectForKey:@"testId"]; 

你有多确定字典是否包含键“testId”的值?做你的字典的NSLog并检查内容,以确保所有内容都像你期望的那样。

我没有看到您的IdDescription类,因此看不到IdDescription保留testid的位置。您是使用(nonatomic, retain)还是类似的?如果是这样,不要忘记,当你做任务时你需要使用self.retain没有发生。

EXC_BAD_ACCESS通常是当消息发送到已释放的对象时。您可以通过在可执行文件设置中设置NSZombieEnabled YES来确认。

如果使用静态分析器shift-sommand-A构建,您可能还会获得一些有用的信息。找到泄漏比溢出问题更好,但是如果您在IdDescription中为testid添加了保留项,并且不会从中获知,那么这是另一个信息,表明testid已在您使用完毕之前发布。

0

你还没有真正发布足够的信息,但概率是desc是一个垃圾指针或desc.testId是你到达NSLog()行时的垃圾指针。请注意,如果其中任何一个都是零,NSLog行不会崩溃,它只会打印

(null) 

两件事你应该检查。

  1. 你在init方法
  2. 保留testId你在init()方法返回的自我。

我敢打赌,你没有保留testId,因为当你用一个常量字符串替换它时,问题就消失了(释放对于常量字符串来说是一个noop)。

0

尝试启用僵尸。这个消息意味着你正在使用的指针不是一个实际上是客观的C对象。很可能是因为你忘记了保留或初始化。

在为可执行文件的信息添加

NSZombieEnabled是