2009-12-01 115 views
0

這是我遇到過一些問題的代碼片段。我有一個適用於99%用戶的iPhone應用程序,但可能有1%的iPhone應用程序可以正常工作,但我有這個問題,我無法在我的最終解決方案或重現問題。該應用程序只是凍結他們,並沒有實際崩潰(所以沒有崩潰報告)。一些特別的分佈測試已經揭示了這個問題在這段代碼中。如果任何人有任何想法可能是什麼問題,請讓我知道。 謝謝。NSString stringWithString問題,iPhone應用程序

NSString *addChar = nil; 

    NSString *fullname = (NSString *)ABRecordCopyCompositeName(record); 
    addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

    [fname release]; 

    NSMutableArray *array = [app_contacts objectForKey:addChar]; // lookup if key exists 

    if (array == nil) // if nothing in key, create new array 
    { 
      NSLog(@"array empty"); 
      NSMutableArray *newarray = [[NSMutableArray alloc] init]; 
      [newarray insertObject:one_person atIndex:0]; 
      [app_contacts setValue:newarray forKey:addChar]; 
      [newarray release]; 
    } 
    else 
    { 
      NSLog(@"array not empty"); 
      [array addObject:one_person]; 
      [app_contacts setValue:array forKey:addChar]; 
    } 

    [addChar release]; 
+1

「[fname發佈]」中的fname是什麼? – 2009-12-01 09:24:37

+0

它應該是[全名發佈]。我從一個很長的方法只剪切和粘貼相關位,所以有一些引用是不正確的。 – 2009-12-01 19:51:38

回答

1

你爲什麼這樣做?

addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

你回來已經是一個字符串:

addChar = [[fullname substringToIndex:1] capitalizedString]; 

省去了[addChar release]以及需要。

+0

謝謝。但是用stringWithString(甚至在最壞的情況下)做這件事會有什麼問題? – 2009-12-01 06:31:45

+0

我可以預見一個奇怪的保留計數錯誤,因爲你正在處理那裏的一些分配 - 只有我看到的怪癖,說實話,其餘的代碼看起來很好(因此我的答案)。這段代碼中有一些符號在其他地方聲明,並且沒有明確的*這是*我所擁有的所有行。 – 2009-12-01 06:43:01

+0

從我的測試來看,這很明顯,這是問題線。但我只是不明白爲什麼,因此我不確定最佳解決方案是什麼。此時遇到此問題的用戶會反覆凍結,而我正在循環查看地址簿。如果這是一個奇怪的保留計數問題,對於同一個人來說,即使重新啓動iPhone之後,它是否會一再出現問題? – 2009-12-01 07:04:43

3

在此代碼:

NSString *fullname = (NSString *)ABRecordCopyCompositeName(record); 
addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

如果全名是等於@「」那麼你會當你調用引發異常[全稱substringToIndex:1]。