2015-04-22 15 views
12

Ứng dụng iOS của tôi vừa bị lỗi với NSRangeException trên -[NSManagedObjectContext save:]. Không có gì khác hữu ích ở bất cứ đâu được tìm thấy. Làm thế nào tôi phải sửa lỗi này? Tôi không nhận được bất kỳ địa chỉ bộ nhớ hoặc bất cứ điều gì mà tôi có thể làm việc với ...Chỉ mục mảng Out of Bounds issue (NSRangeException) trong - [NSManagedObjectContext save:]

2015-04-22 14:16:38.078 heavenhelp[33559:1734247] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]' 
*** First throw call stack: 
(
    0 CoreFoundation      0x0167f746 __exceptionPreprocess + 182 
    1 libobjc.A.dylib      0x00f40a97 objc_exception_throw + 44 
    2 CoreFoundation      0x01553b73 -[__NSArrayM objectAtIndex:] + 243 
    3 CoreData       0x00859cf3 -[NSSQLCore recordToManyChangesForObject:inRow:usingTimestamp:inserted:] + 2531 
    4 CoreData       0x00856a0b -[NSSQLCore _populateRow:fromObject:timestamp:inserted:] + 2923 
    5 CoreData       0x00776e24 -[NSSQLCore prepareForSave:] + 1764 
    6 CoreData       0x00775e3d -[NSSQLCore saveChanges:] + 461 
    7 CoreData       0x0073f15e -[NSSQLCore executeRequest:withContext:error:] + 638 
    8 CoreData       0x0083ee75 __65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke + 5349 
    9 CoreData       0x008492ff gutsOfBlockToNSPersistentStoreCoordinatorPerform + 191 
    10 libdispatch.dylib     0x035f4bef _dispatch_client_callout + 14 
    11 libdispatch.dylib     0x035d7b0d _dispatch_barrier_sync_f_invoke + 144 
    12 libdispatch.dylib     0x035d723f dispatch_barrier_sync_f + 105 
    13 CoreData       0x008383f7 _perform + 183 
    14 CoreData       0x0073ec8b -[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 459 
    15 CoreData       0x0076ee09 -[NSManagedObjectContext save:] + 1529 
    16 heavenhelp       0x000b6834 _TF10heavenhelp11saveContextFT_T_ + 324 
    17 heavenhelp       0x0015368d _TFC10heavenhelp26ConversationViewController17viewWillDisappearfS0_FSbT_ + 701 
    18 heavenhelp       0x001536ef _TToFC10heavenhelp26ConversationViewController17viewWillDisappearfS0_FSbT_ + 63 
    19 UIKit        0x020a4292 -[UIViewController _setViewAppearState:isAnimating:] + 706 
    20 UIKit        0x020a4904 -[UIViewController __viewWillDisappear:] + 106 
    21 UIKit        0x020bcd1d -[UIViewController(UIContainerViewControllerProtectedMethods) beginAppearanceTransition:animated:] + 200 
    22 UIKit        0x020cafec -[UINavigationController _startCustomTransition:] + 1028 
    23 UIKit        0x020d8e00 -[UINavigationController _startDeferredTransitionIfNeeded:] + 712 
    24 UIKit        0x020d9a51 -[UINavigationController __viewWillLayoutSubviews] + 57 
    25 UIKit        0x02253750 -[UILayoutContainerView layoutSubviews] + 213 
    26 UIKit        0x01fce57a -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 668 
    27 libobjc.A.dylib      0x00f56771 -[NSObject performSelector:withObject:] + 70 
    28 QuartzCore       0x01d5ee47 -[CALayer layoutSublayers] + 144 
    29 QuartzCore       0x01d52925 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 403 
    30 QuartzCore       0x01d5277a _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26 
    31 QuartzCore       0x01caec52 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 284 
    32 QuartzCore       0x01cb00e5 _ZN2CA11Transaction6commitEv + 487 
    33 QuartzCore       0x01cb07fc _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92 
    34 CoreFoundation      0x015a086e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30 
    35 CoreFoundation      0x015a07b0 __CFRunLoopDoObservers + 400 
    36 CoreFoundation      0x015961ea __CFRunLoopRun + 1226 
    37 CoreFoundation      0x01595a5b CFRunLoopRunSpecific + 443 
    38 CoreFoundation      0x0159588b CFRunLoopRunInMode + 123 
    39 GraphicsServices     0x046cc2c9 GSEventRunModal + 192 
    40 GraphicsServices     0x046cc106 GSEventRun + 104 
    41 UIKit        0x01f3b106 UIApplicationMain + 1526 
    42 heavenhelp       0x000a5c94 main + 180 
    43 libdyld.dylib      0x0361fac9 start + 1 
) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

Đây là mã tôi đã sử dụng để làm cho tôi save: thread-safe:

static var onceToken: dispatch_once_t = 0 
static var singleton: CoreDataHelper! 
static var sharedInstance: CoreDataHelper { 
    get { 
     dispatch_once(&onceToken, { 
      self.singleton = CoreDataHelper() 
     }) 
     return singleton 
    } 
} 

My xcdatamodeld (các phần có liên quan):

xcdatamodeld

chỉnh sửa: tôi đã chỉnh sửa mã để phản ánh những thay đổi của tôi để làm cho an toàn chủ đề an toàn của mình là NSManagedObjectContext. Tất cả những gì tôi làm bây giờ, tôi làm trên một ví dụ của tôi CoreDataHelper mà tôi khởi tạo như trên. Tôi đã tìm thấy tôi có thể kích hoạt một vụ tai nạn bằng cách đi vào một cuộc trò chuyện, thêm một tin nhắn, đi vào một cuộc trò chuyện khác và thêm một tin nhắn ở đó. Tôi đã thêm xcdatamodeld của mình.

+0

hiện nó cũng xảy ra trong trình giả lập không? Thông báo lỗi có thể sẽ rõ ràng hơn có – vib

+1

"chỉ số 6 vượt quá giới hạn [0 .. 5]" Điều này có nghĩa là bạn đang cố truy cập đối tượng thứ 7 từ mảng chỉ có 6 đối tượng. Và thêm một điểm break đặc biệt, nó sẽ cho bạn thấy trực tiếp whats dòng đó. – user4261201

+0

@Nandu, đối tượng thứ 7 trong một mảng gồm 6 đối tượng. – vikingosegundo

Trả lời

2

tôi dường như đã thiết lập mối quan hệ của tôi một-nhiều giữa cuộc hội thoại và tin nhắn để "ra lệnh". Điều này không đúng ... Tôi đã thay đổi lớp của NSManagedObject để sử dụng NSMutableSet thay vì NSMutableOrderedSet.

Rõ ràng kết quả này trong một NSRangeException trong phương thức lưu ...

0

Một nơi nào đó trong AppDelegate bạn đang tạo NSArray,

Bằng cách thêm ngoại lệ breakpoint bạn có thể kiểm tra các dòng gây lỗi.

phương pháp thêm Điểm ngắt ngoại lệ là trên các liên kết sau.

http://blog.manbolo.com/2012/01/23/xcode-tips-1-break-on-exceptions https://developer.apple.com/library/ios/recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html

+0

Tôi không thể chấp nhận câu trả lời, nhưng tôi có thể nói với bạn rằng tôi không tạo một 'NSArray' trong' AppDelegate'. Tôi đã bình chọn bạn cho đề xuất thêm điểm ngắt ngoại lệ. – vrwim

+0

Thêm điểm ngắt ngoại lệ cho biết lỗi xảy ra trong '[NSManagedObjectContext save:]' ... Tôi phải làm gì bây giờ? – vrwim

+0

bạn có thể chia sẻ thêm mã không? – aBilal17

0

bạn nói bạn đã thực hiện tiết kiệm của bạn chủ đề tiết kiệm-method. bạn có thể vui lòng hiển thị một số mã?

thường tôi đang làm một cái gì đó như thế này:

// create object with concurrency where you need it 
[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 


// wrapper for saving 
- (BOOL)saveContext 
{ 
    __block BOOL success = NO; 

    NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 
    if (managedObjectContext != nil) 
    { 
     [managedObjectContext performBlockAndWait:^{ 
      if([managedObjectContext hasChanges]) 
      { 
       NSError *error = nil; 
       success = [managedObjectContext save:&error]; 

       if (success == NO) 
       { 
        NSLog(@"Unresolved error %@", error.localizedDescription); 
       } 
      } 
     }]; 
    } 

    return success; 
} 
+0

Tôi đã thêm mã của mình. Tôi đã sử dụng một 'NSLock' toàn cầu mà tôi khóa và mở khóa xung quanh phương thức' save' của tôi. – vrwim

+0

Khóa đó sẽ không giúp được gì nếu bạn đang sử dụng MOC trên một chủ đề khác mà bạn đã tạo ra nó. Một quy tắc cho MOCBusters là KHÔNG CHÉO THREADS. Bạn có thể chia sẻ mã dispatch_async bạn đang sử dụng để –

+0

cảm ơn. Tôi không quen thuộc với 'NSLock' ở tất cả ... bạn có thể thử sử dụng' performBlock' hoặc 'performBlockAndWait' vì syncronising là mục đích của những phương thức đó. bạn có thể tìm thêm thông tin về nó tại đây: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/ – donmarkusi

Các vấn đề liên quan