2010-08-06 52 views
7

我得到的集合被枚舉異常時發生了異常,當我使用此代碼時,任何人都可以告訴我如何擺脫這種情況。因爲「集合被枚舉時發生了變化」而得到的異常

PaymentTerms * currentElement; 
for (currentElement in termsArray) 
{ 
    printf("\n currentElement Value........%s",[currentElement.days UTF8String]); 
    printf("\n Str value...%s",[Str UTF8String]); 
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch]; 
    if(!(range.location != NSNotFound)) 
    { 
     PaymentTerms *pTerm1 = [[PaymentTerms alloc]init]; 
     pTerm1.days = Str; 
     printf("\n pTerm1.days...%s",[ pTerm1.days UTF8String]); 
     [termsArray addObject:pTerm1]; 
    } 
} 

希望我能從你方得到快速回復。 預先感謝, Monish。

回答

16

枚舉時不能更改數組。作爲解決方法,您應該在臨時數組中累積新對象並在枚舉後添加它們:

PaymentTerms * currentElement; 
NSMutableArray* tempArray = [NSMutableArray array]; 
for (currentElement in termsArray) 
{ 
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch]; 
    if(!(range.location != NSNotFound)) 
    { 
     PaymentTerms *pTerm1 = [[PaymentTerms alloc]init]; 
     pTerm1.days = Str; 
     [tempArray addObject:pTerm1]; 
     [pTerm1 release]; 
    } 
} 
[termsArray addObjectsFromArray: tempArray]; 

P.S.不要忘記發佈你創建的pTerm1對象 - 你的代碼包含內存泄漏

在迴應海報的評論(和實際任務) - 我認爲最簡單的方法來使bool標誌指示是否在週期中找到日期值。如果沒有 - 添加新的對象後,循環結束:

PaymentTerms * currentElement; 
BOOL dayFound = NO; 
for (currentElement in termsArray) 
{ 
    NSRange range = [currentElement.days rangeOfString:Str options:NSCaseInsensitiveSearch]; 
    if(range.location != NSNotFound) 
     dayFound = YES; 
} 
if (!dayFound) 
    // Create and add new object here 
+0

感謝您有用code.but我有一個更problem.Actually事情是我需要檢查字符串數組,如果它不存在,我必須將它添加到陣列list.Now問題我有3個項目在我的列表中,這不等於我正在尋找的字符串,所以它將3次而不是1次添加對象。是否有任何其他建議。 – 2010-08-06 15:14:25

+0

您不需要在此處釋放tempArray,因爲您從不擁有它。另外,'!(range.location!= NSNotFound)'和'(range.location == NSNotFound)'是一樣的。 – JeremyP 2010-08-06 15:15:14

+0

@vodkhang,不這樣做,你只要添加一個新的元素,如果任何在termsArray中的對象的日期屬性不同於Str – Vladimir 2010-08-06 15:25:15

2

該行[termsArray addObject:pTerm1]; 將拋出該異常。你不能爲每個循環添加/刪除一個數組中的元素。 for (currentElement in termsArray)

0

你正在向你的集合添加一個對象,因爲你正在循環它,那是什麼導致了錯誤。您if語句嵌套內for

0

,因爲你是內增加termsArray新對象的for循環

  • 創建一個新的空數組(egnewTermsArray)
  • 在第一循環創建出現的錯誤並添加這些新項目newTermsArray
  • 然後,你將需要第二個環路從newTermsArray項目加回原termsArray
1

是......我們無法一一列舉,而陣列得到更新...這可能會惹惱誰是從ActionScript background.Some次事情的程序員更糟的是,「當你更新枚舉數時,你甚至不會在運行時發生崩潰或暗示」 - 當時執行的行爲異常。

順便說一句,你可以去這種類型的實現,你可以對你的代碼做一些小的修改。

for (int i=0 ; i< termsArray.count ;i++) //counting termsArray on every iteration 
{ 
    id currentElement = [ termsArray objectAtIndex:i]; 
    ...... 
    ..... 
} 

中 - 當然,這(我< termsArray.count)看起來糟糕,因爲我們計算每次迭代的個性化......在這裏,這就是訣竅有輕微changes.But我會強烈建議弗拉基米爾作爲其明確的閱讀實施。

-2

使用try和catch在nsmutable陣列

@try { 
    //code for accessing element. 

    } 
    @catch (NSException *exception) { 


     /// show exception here 

    } 
+1

這不會回答OP的問題,您的新代碼是正確的 – 2012-06-06 17:56:24

0

只是在一個相當複雜的應用程序處理相同的錯誤處理異常。解決方法很簡單 - 創建一個副本並處理數組的副本(並根據需要將其從原始副本中刪除),然後丟棄副本。

for(CharacterModelNode* node in self.allPlayers) 
{ 
    // Some operation that may mutate allPlayers (ex: player dies from poison damage and is removed from this array at some other part of an app) 

} 

//workaround in some cases - create a copy of array and run operations that can kill player on this array (it will not be mutated anywhere else in the app 

NSArray* allPlayersCopy = [self.allPlayers copy]; 

for(CharacterModelNode* node in allPlayersCopy) 
{ 
    [node.character refreshBuffs]; 
} 
相關問題