Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Hiển thị ảnh lên UIScrollview lỗi: Terminating app due to uncaught exception ... was mutated while being enumerated?

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    117

    Mặc định Hiển thị ảnh lên UIScrollview lỗi: Terminating app due to uncaught exception ... was mutated while being enumerated?

    Chương trình mình viết để hiển thị ảnh lên UIScrollview. kiểu gallery image.

    Lỗi crash trong lúc mình load ảnh (phần lớn load không sao thỉnh thoảng mới bắn ra lỗi.)

    *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x4e68720> was mutated while being enumerated.(
    mỗi khi người dùng kéo UIScrollview đến 1 vị trí nhất định mình sẽ cho send SOAP request đến Service để nhận về 10 link ảnh .
    mỗi khi nhận được thông tin ảnh + link ảnh mình lưu vào 1 object sau đó add vào 1 NSMutableArray.
    sau đó trong hàm hiển thị ảnh mình xác định vị trí ảnh hiển thị trong uiscrollview sau đó Add 1 uiimageview vào vị trí đó. Với mỗi ảnh mình tạo 1 thread để load ảnh đó :

    C++ Code:
    1. NSThread *thread_ = [NSThread alloc];
    2.         [thread_ initWithTarget:self
    3.                         selector:@selector(DisplayAImage:)
    4.                          object: ip]; // ip là đối tượng chứa thông tin ảnh
    5.         [threads addObject:thread_];
    6.         [thread_ start];
    7.         [thread_ release];

    Đây là function để load mỗi ảnh (load ảnh từ link nếu ảnh không có trong bộ nhớ nếu không hiển thị ảnh trong bộ nhớ máy.):

    C++ Code:
    1. - (void) DisplayAImage:(ImagePosition *)ip{
    2.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    3.     ImagePosition *newIp = [ip copy];
    4.     UIImage *image;
    5.     NSData *data;
    6.     NSFileManager *fileManager = [NSFileManager defaultManager];
    7.     if(![fileManager fileExistsAtPath:[self PathOfFile:newIp.imageID]]) {
    8.         NSURL *url = [[NSURL alloc] initWithString:newIp.imageUrl];
    9.         [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    10.         [[NSURLCache sharedURLCache] setDiskCapacity:0];
    11.         data = [[NSData alloc] initWithContentsOfURL:url];
    12.         [url release];
    13.         [data writeToFile:[self PathOfFile:newIp.imageID] atomically:YES];
    14.        
    15.     }else{
    16.         data = [[NSData alloc] initWithContentsOfFile:[self PathOfFile:newIp.imageID]];
    17.         NSLog(@"Cache . . . . . . . ");
    18.     }
    19.     image = [[UIImage alloc] initWithData:data];
    20.     [data release];
    21.     UIImageView *image1 = (UIImageView*)[myScrollView viewWithTag:newIp.imageID];
    22.     [image1 setImage:image];
    23.     [image release];
    24.     [pool release];
    25. }

    Đây là full lỗi hiện ra ở debug.

    *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x4e68720> was mutated while being enumerated.(
    "<CALayer: 0x4e686f0>",
    "<CALayer: 0x4b5d490>",
    "<CALayer: 0x4b8a220>",
    "<CALayer: 0x4b16df0>",
    "<CALayer: 0x4e65250>",
    "<CALayer: 0x4e4c7e0>",
    "<CALayer: 0x4e33590>",
    "<CALayer: 0x4b99430>",
    "<CALayer: 0x4bac290>",
    "<CALayer: 0x4b385d0>",
    "<CALayer: 0x4b6b4b0>",
    "<CALayer: 0x4e73220>",
    "<CALayer: 0x4e39600>",
    "<CALayer: 0x4b93cf0>",
    "<CALayer: 0x4b6c000>",
    "<CALayer: 0x4e708e0>",
    "<CALayer: 0x4e40430>",
    "<CALayer: 0x4b38e30>",
    "<CALayer: 0x4e67b00>",
    "<CALayer: 0x4e53b20>",
    "<CALayer: 0x4e71690>",
    "<CALayer: 0x4b6c910>",
    "<CALayer: 0x4b96170>",
    "<CALayer: 0x4ba46e0>",
    "<CALayer: 0x4e43010>",
    "<CALayer: 0x4e41550>",
    "<CALayer: 0x4b992b0>",
    "<CALayer: 0x4b5f2e0>",
    "<CALayer: 0x4b98440>",
    "<CALayer: 0x4e68580>",
    "<CALayer: 0x4b90ab0>",
    "<CALayer: 0x4b33ca0>",
    "<CALayer: 0x4b87090>",
    "<CALayer: 0x4babf20>",
    "<CALayer: 0x4b69b20>",
    "<CALayer: 0x4e67380>",
    "<CALayer: 0x4e38a30>",
    "<CALayer: 0x4b18040>",
    "<CALayer: 0x4b82d70>",
    "<CALayer: 0x4b34140>",
    "<CALayer: 0x4e62fd0>",
    "<CALayer: 0x4b670a0>",
    "<CALayer: 0x4b9abb0>",
    "<CALayer: 0x4e48640>",
    "<CALayer: 0x4e6ad20>",
    "<CALayer: 0x4b311e0>",
    "<CALayer: 0x4b61470>",
    "<CALayer: 0x4e74340>",
    "<CALayer: 0x4b9a390>",
    "<CALayer: 0x4b8c9e0>",
    "<CALayer: 0x4e487c0>",
    "<CALayer: 0x4b301c0>",
    "<CALayer: 0x4b86d80>",
    "<CALayer: 0x4e6c440>",
    "<CALayer: 0x4b8e840>",
    "<CALayer: 0x4b60d40>",
    "<CALayer: 0x4e65020>",
    "<CALayer: 0x4e3d960>",
    "<CALayer: 0x4e50060>",
    "<CALayer: 0x4e6cdb0>",
    "<CALayer: 0x4b38360>",
    "<CALayer: 0x4e38710>",
    "<CALayer: 0x4e4bc60>",
    "<CALayer: 0x4b96340>",
    "<CALayer: 0x4bb1440>",
    "<CALayer: 0x4e5d130>",
    "<CALayer: 0x4e61bb0>",
    "<CALayer: 0x4b60270>",
    "<CALayer: 0x4b378a0>",
    "<CALayer: 0x4b7c010>",
    "<CALayer: 0x4e3b280>",
    "<CALayer: 0x4e464f0>",
    "<CALayer: 0x4e467e0>",
    "<CALayer: 0x4e5fe60>",
    "<CALayer: 0x4b7ba80>",
    "<CALayer: 0x4b3c490>",
    "<CALayer: 0x4b99640>",
    "<CALayer: 0x4e43e10>",
    "<CALayer: 0x4e5d840>",
    "<CALayer: 0x4bb2110>",
    "<CALayer: 0x4e38cc0>",
    "<CALayer: 0x4b7e6f0>",
    "<CALayer: 0x4e5dce0>",
    "<CALayer: 0x4b3be20>",
    "<CALayer: 0x4e6fe20>",
    "<CALayer: 0x4e5a4f0>",
    "<CALayer: 0x4e6d010>",
    "<CALayer: 0x4e6d160>",
    "<CALayer: 0x4e606d0>",
    "<CALayer: 0x4e703b0>",
    "<CALayer: 0x4e5a580>",
    "<CALayer: 0x4b31db0>",
    "<CALayer: 0x4b74ea0>",
    "<CALayer: 0x4b853c0>",
    "<CALayer: 0x4b98d20>",
    "<CALayer: 0x4b8bc80>",
    "<CALayer: 0x4b96ed0>",
    "<CALayer: 0x4b962b0>",
    "<CALayer: 0x4e5ac10>",
    "<CALayer: 0x4e717e0>",
    "<CALayer: 0x4b7a7a0>",
    "<CALayer: 0x4e41030>",
    "<CALayer: 0x4e4aef0>",
    "<CALayer: 0x4e3efe0>",
    "<CALayer: 0x4b7f1f0>",
    "<CALayer: 0x4e6f050>",
    "<CALayer: 0x4e4d5d0>",
    "<CALayer: 0x4b82a30>",
    "<CALayer: 0x4b77910>",
    "<CALayer: 0x4b6adf0>",
    "<CALayer: 0x4e46c60>",
    "<CALayer: 0x4e5cae0>",
    "<CALayer: 0x4b81ac0>",
    "<CALayer: 0x4b83150>",
    "<CALayer: 0x4b43bb0>",
    "<CALayer: 0x4b7a320>",
    "<CALayer: 0x4e61e90>",
    "<CALayer: 0x4e6b4e0>",
    "<CALayer: 0x4e61ef0>"
    )'
    *** Call stack at first throw:
    (
    0 CoreFoundation 0x00f405a9 __exceptionPreprocess + 185
    1 libobjc.A.dylib 0x01094313 objc_exception_throw + 44
    2 CoreFoundation 0x00f40069 __NSFastEnumerationMutationHandler + 377
    3 UIKit 0x001cc26e -[UIView(Hierarchy) viewWithTag:] + 219
    4 MyApp 0x0000481a -[MyAppViewController DisplayAImage:] + 1210
    5 Foundation 0x00904cf4 -[NSThread main] + 81
    6 Foundation 0x00904c80 __NSThread__main__ + 1387
    7 libSystem.B.dylib 0x9043e259 _pthread_start + 345
    8 libSystem.B.dylib 0x9043e0de thread_start + 34
    )
    terminate called after throwing an instance of 'NSException'

    Qua search thu thập được 1 số lỗi do sử dụng biến toàn cục trong thread, truy xuất + sửa Array cùng lúc. nhưng nhìn lại code mình không phát hiện được ra chỗ nào :(

    Ai đã từng gặp vấn đề này help với

    Thanks and Best Regards.

  2. #2
    Ngày gia nhập
    08 2011
    Bài viết
    117

    Search hoài cũng được cái này :

    You must not try to modify the UI on a separate thread. UI should only be manipulated on the main thread.

    Instead of detaching a new thread, you should use performSelectorOnMainThread:withObject:waitUntilDo ne:. This will ensure that the method will be called on the proper thread.
    Và đã giải quyết được bằng cách load ảnh trong main thread.

    Tuy nhiên chương trình hoạt động không được mượt như trước :(

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    15

    Mình cũng mới bắt đầu tìm hiểu về Obj C , hôm cũng có làm 1 cái sample về UIscrollView , nhưng mình làm theo video hương giẫn . Ko thấy lỗi , nếu vẫn ko sửa đc thì bạn có thể search các video tutorial xem sao .
    Chứ nói thế này + mình cũng mới lọ mọ Obj C nên chỉ dám góp ý tý thui .
    Chúc bạn thành công .

  4. #4
    Ngày gia nhập
    08 2011
    Bài viết
    117

    Trích dẫn Nguyên bản được gửi bởi ngocsonaat Xem bài viết
    Mình cũng mới bắt đầu tìm hiểu về Obj C , hôm cũng có làm 1 cái sample về UIscrollView , nhưng mình làm theo video hương giẫn . Ko thấy lỗi , nếu vẫn ko sửa đc thì bạn có thể search các video tutorial xem sao .
    Chứ nói thế này + mình cũng mới lọ mọ Obj C nên chỉ dám góp ý tý thui .
    Chúc bạn thành công .
    mấy cái tuttorial chỉ demo đơn giản thôi bạn :( cái reply thứ 2 của t đã giúp t biết được chính xác nguyên nhân, giờ chỉ còn tìm cách giải quyết sao cho vẫn mượt như lúc sử dụng thread lại không bị crash như như không sử dụng thread để load ảnh trong đầu đã có ý tưởng rồi , mai lên cty thử xem thế nào giờ ngủ đã

Các đề tài tương tự

  1. Bị lỗi exception out of memory
    Gửi bởi bodoidn trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 25-10-2013, 06:14 PM
  2. Trả lời: 2
    Bài viết cuối: 05-06-2013, 07:48 AM
  3. Exception Lỗi: "The type initializer for 'PublicMethods' threw an exception."?
    Gửi bởi khatran trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 29-02-2012, 06:42 PM
  4. Structured Exception Handling (SEH) và C++ Exception Handling khác nhau như thế nào
    Gửi bởi Kevin Hoang trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 0
    Bài viết cuối: 05-01-2012, 11:24 AM
  5. Lập trình C++0x Exception in Qt
    Gửi bởi nthung trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 22-05-2010, 03:47 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn