2010-08-06 37 views
7

Tôi nhận được Bộ sưu tập bị đột biến trong khi được liệt kê ngoại lệ khi tôi sử dụng mã này bất kỳ ai có thể đề xuất cho tôi cách thoát khỏi điều này.Nhận ngoại lệ là "Bộ sưu tập bị đột biến trong khi được liệt kê"

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]; 
    } 
} 

Hy vọng tôi sẽ nhận được phản hồi nhanh từ phía bên. Cảm ơn trước, Monish.

Trả lời

16

Bạn không thể thay đổi mảng khi đang liệt kê nó. Để giải quyết sự cố, bạn nên tích lũy các đối tượng mới trong mảng tạm thời và thêm chúng sau khi liệt kê:

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. Đừng quên phát hành đối tượng pTerm1 bạn tạo - mã của bạn có chứa rò rỉ bộ nhớ

Trả lời nhận xét của người đăng (và tác vụ thực tế) - Tôi nghĩ cách dễ nhất để tạo cờ bool cho biết giá trị ngày được tìm thấy trong chu kỳ. Nếu không - thêm đối tượng mới sau khi chu kỳ kết thúc:

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

Cảm ơn mã hữu ích của bạn.nhưng tôi có thêm một vấn đề nữa.Tôi cần kiểm tra chuỗi nếu không có. Tôi phải thêm chuỗi đó vào danh sách mảng. Vấn đề là Tôi đã có 3 mục trong danh sách của tôi mà không phải là bằng chuỗi tôi đang tìm kiếm vì vậy nó đã được thêm đối tượng 3 lần thay vì 1 thời gian. Có bất kỳ đề xuất khác cho việc này. –

+0

Bạn không cần phải phát hành tempArray ở đây vì bạn không bao giờ sở hữu nó. Ngoài ra, '! (Range.location! = NSNotFound)' cũng giống như '(range.location == NSNotFound)'. – JeremyP

+0

@vodkhang, không làm như vậy bạn sẽ chỉ thêm một phần tử mới nếu bất kỳ đối tượng nào trong termsArray có thuộc tính ngày khác với các biến op Str – Vladimir

2

Dòng này [termsArray addObject:pTerm1]; sẽ ném ngoại lệ đó. Bạn KHÔNG THỂ thêm/xóa một phần tử từ một mảng bên trong một cho mỗi vòng lặp. for (currentElement in termsArray)

0

bạn đang thêm đối tượng vào bộ sưu tập của mình khi bạn đang lặp lại nó, đó là nguyên nhân gây ra lỗi. tuyên bố if của bạn được lồng bên trong for

0

Lỗi này xảy ra bởi vì bạn đang thêm các đối tượng mới để termsArray trong vòng lặp for

  • Tạo một mảng trống mới (egnewTermsArray)
  • Trong vòng đầu tiên tạo và thêm các mục mới này vào newTermsArray
  • Sau đó, bạn sẽ cần một vòng lặp thứ hai để thêm các mục từ newTermsArray trở lại vào điều khoản gốcArray
1

Có ... chúng tôi không thể liệt kê trong khi mảng được nhận được cập nhật ... Điều này có thể được kích thích cho các lập trình viên đến từ ActionScript background.Some lần thứ đi tồi tệ hơn như "Bạn thậm chí không nhận được một tai nạn hoặc intimation tại thời gian chạy khi bạn cập nhật một số mảng trong khi nó đang được liệt kê" -Thực hiện chỉ cư xử bất thường tại thời điểm đó.

Btw bạn có thể thực hiện loại triển khai này, nơi bạn có thể có những thay đổi nhỏ đối với mã của mình.

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

Of-Dĩ nhiên, này (i < termsArray.count) có vẻ xấu như chúng ta đang tính toán số lượng cho mỗi lần lặp ... Và thats lừa vào đây để có changes.But nhỏ tôi rất muốn giới thiệu Vladimir của thực hiện như là rõ ràng cho việc đọc.

-2

sử dụng thử và nắm bắt để xử lý ngoại lệ trong mảng nsmutable

@try { 
    //code for accessing element. 

    } 
    @catch (NSException *exception) { 


     /// show exception here 

    } 
+1

Điều này không trả lời câu hỏi của OP. Vui lòng đọc lại câu hỏi và xem xét câu trả lời của @ Vladimir. –

0

Chỉ cần xử lý với các lỗi tương tự trong một ứng dụng khá phức tạp. Giải pháp là đơn giản - tạo một bản sao và làm việc với bản sao của mảng (và loại bỏ nó khỏi bản gốc nếu bạn muốn. Sau đó, loại bỏ các bản sao.

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]; 
} 
Các vấn đề liên quan