2010-09-30 82 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是