0

解決できない問題があります。Core Data フレームワークを使用して iOS アプリケーションを作成しています。NSRangeException が発生するまで、すべてが順調に進んでいました。この例外は、アプリケーション データを更新する必要があるかどうかをチェックする関数で取得されます。

私のコードは次のとおりです。

- (BOOL) isTimetableUpdatedWithJSONData:(NSMutableDictionary*) data
{
    appDelegate = [[UIApplication sharedApplication] delegate];
    managedObjectContext = [appDelegate managedObjectContext];

    //Do database update check logic here
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"MobileTimetableDataHash"     inManagedObjectContext:managedObjectContext]];

    NSError *error = nil;
    NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];

    if (error != nil)
    {
        [self printErrorAlert];
    }
    //THERE IS ERROR HERE
    NSManagedObject* changesGrabbed = [results objectAtIndex:0];
    NSString *changesFromDatabase = [changesGrabbed valueForKey:@"changes"];
    NSString *changesFromService = [data valueForKeyPath:@"changes"];

    if ([changesFromService isEqualToString:changesFromDatabase])
    {
        return YES;
    }
    else
    {
        [changesGrabbed setValue:changesFromService forKey:@"changes"];

        [managedObjectContext save:&error];

        if (error != nil)
        {
            [self printErrorAlert];
        }
        return NO;
    }

}

例外:

2014-06-12 21:36:12.034 MIF[437:60b] *** Terminating app due to uncaught exception     'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for     empty array'
*** First throw call stack:
(
0   CoreFoundation                      0x0000000101cb3495 __exceptionPreprocess +     165
1   libobjc.A.dylib                     0x0000000101a1299e objc_exception_throw + 43
2   CoreFoundation                      0x0000000101c6be3f -[__NSArrayI     objectAtIndex:] + 175
3   MIF                                 0x0000000100001942 -[MIFTimetableService     isTimetableUpdatedWithJSONData:] + 514
4   MIF                                 0x000000010000219d -[MIFAppDelegate     synchrinizeTimetableService] + 157
5   MIF                                 0x0000000100001dc2 -[MIFAppDelegate     application:didFinishLaunchingWithOptions:] + 114
6   UIKit                               0x00000001005ba3d9 -[UIApplication     _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 264
7   UIKit                               0x00000001005babe1 -[UIApplication     _callInitializationDelegatesForURL:payload:suspended:] + 1605
8   UIKit                               0x00000001005bea0c -[UIApplication     _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 660
9   UIKit                               0x00000001005cfd4c -[UIApplication     handleEvent:withNewEvent:] + 3189
10  UIKit                               0x00000001005d0216 -[UIApplication     sendEvent:] + 79
11  UIKit                               0x00000001005c0086 _UIApplicationHandleEvent     + 578
12  GraphicsServices                    0x0000000103ce671a _PurpleEventCallback +     762
13  GraphicsServices                    0x0000000103ce61e1 PurpleEventCallback + 35
14  CoreFoundation                      0x0000000101c35679     __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
15  CoreFoundation                      0x0000000101c3544e __CFRunLoopDoSource1 +    478
16  CoreFoundation                      0x0000000101c5e903 __CFRunLoopRun + 1939
17  CoreFoundation                      0x0000000101c5dd83 CFRunLoopRunSpecific +     467
18  UIKit                               0x00000001005be2e1 -[UIApplication _run] +     609
19  UIKit                               0x00000001005bfe33 UIApplicationMain + 1010
20  MIF                                 0x0000000100001d23 main + 115
21  libdyld.dylib                       0x000000010234b5fd start + 1
22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

みんな、誰か助けてくれませんか?私は本当にあなたの助けが必要です。ありがとうございました。

4

3 に答える 3

2

あなたのトラブルメーカーは

NSManagedObject* changesGrabbed = [結果 objectAtIndex:0];

結果が空の配列の場合、 objectAtIndex:0を呼び出すと、インデックス 0 にオブジェクトがないため、NSRangeException が発生します。この場合、firstObject() は単に nil を返します。

于 2014-06-12T19:06:41.277 に答える
1

空の配列からオブジェクトを取得しようとしています。最初に、配列にオブジェクトが含まれているかどうかを確認する必要があります。count次のプロパティを使用します。

if (results.count > 0) {
    NSManagedObject* changesGrabbed = [results objectAtIndex:0];
    //continue...
} else {
    //Array is empty, object 0 will be beyond bounds
}
于 2014-06-12T19:02:12.210 に答える
1

直前

NSManagedObject* changesGrabbed = [results objectAtIndex:0];

返された結果に基づいてブランチを追加します。次のようなもの:

if (results && [results count] > 0) {
    NSManagedObject* changesGrabbed = [results objectAtIndex:0];
    ...
}

あなたの配列は空です。スタックトレースは、ほとんどあなたのためにそれを綴っています -

reason: ' * -[__NSArrayI objectAtIndex:]: インデックス 0 が
空の配列の境界を超えています'

于 2014-06-12T19:03:29.933 に答える