线程信号SIGABRT异常

时间:2014-07-03 04:08:15

标签: ios objective-c

我很想知道为什么我会收到有关此代码的异常以及此异常的含义。当我删除for循环时,如下所示,它可以正常工作。当我加入它时,我得到一个例外。

-(void) loadVenues {
    NSString *latLon = @"34.0500, -118.2500"; // approximate latLon of The Mothership (a.k.a Apple headquarters)
    NSString *clientID = kCLIENTID;
    NSString *clientSecret = kCLIENTSECRET;
    //34.0500° N, 118.2500
    NSDictionary *queryParams = @{@"ll" : latLon,
                                  @"client_id" : clientID,
                                  @"client_secret" : clientSecret,
                                  @"categoryId" : @"4bf58dd8d48988d1e0931735",
                                  @"v" : @"20140118"};
    [[RKObjectManager sharedManager] getObjectsAtPath:@"/v2/venues/search"
                                           parameters:queryParams
                                              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
            _venues = mappingResult.array;
            NSMutableArray *temp = [(NSArray*)_venues mutableCopy];                                   
            for (int i =0; i < _venues.count; i++)                                            
            {
                NSUInteger index = 0;
                for (int j = 0; j <_venues.count; j++)
                {
                    //((MyObjectType *) [myArray objectAtIndex:0]).intProperty = 12345;
                    if(((Venue *) [temp objectAtIndex:index]).location.distance > 0)
                    {
                        Venue *holder= [temp objectAtIndex:index];
                        [temp removeObjectAtIndex:index];
                        NSUInteger indexer = index +1;
                        [temp addObject:[temp objectAtIndex:indexer]];
                        //replace a with a+1
                        [temp replaceObjectAtIndex:indexer withObject:holder];

                        //[temp addObject:holder atIndex: index+1];
                        //a[i+1]=holder;
                        index++;
                    }
                    else {index++;}
                }
            }
            _venues = temp;
            [self.tableView reloadData];
        }
        failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"What do you mean by 'there is no coffee?': %@", error);
        }
    ];
}

我在这一行得到例外:

[temp addObject:[temp objectAtIndex:indexer]];

我不确定原因。

这是错误:

  2014-07-02 21:43:12.536 CoffeeKit[63581:60b] I restkit:RKLog.m:33 RestKit logging initialized...
2014-07-02 21:43:12.655 CoffeeKit[63581:60b] I restkit.network:RKObjectRequestOperation.m:150 GET 'https://api.foursquare.com/v2/venues/search?categoryId=4bf58dd8d48988d1e0931735&client_id=ZE5VJOPEO1PP3NDFVCM3O2ZUXWDDJRB20XDDGH3OETBKOVZB&client_secret=5LGY2CEASBQZQS5P0LYFICWDKMDOHJJ00F3G24LT4J4DX4X3&ll=34.0500%2C%20-118.2500&v=20140118'
2014-07-02 21:43:13.085 CoffeeKit[63581:f03] I restkit.network:RKObjectRequestOperation.m:220 GET 'https://api.foursquare.com/v2/venues/search?categoryId=4bf58dd8d48988d1e0931735&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&ll=34.0500%2C%20-118.2500&v=20140118' (200 OK / 30 objects) [request=0.4171s mapping=0.0128s total=0.4486s]
2014-07-02 21:43:13.087 CoffeeKit[63581:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 29 beyond bounds [0 .. 28]'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001023a0495 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x00000001020ff99e objc_exception_throw + 43
    2   CoreFoundation                      0x0000000102346745 -[__NSArrayM objectAtIndex:] + 213
    3   CoffeeKit                           0x0000000100002efa __34-[MasterViewController loadVenues]_block_invoke + 602
    4   CoffeeKit                           0x000000010009310b __66-[RKObjectRequestOperation setCompletionBlockWithSuccess:failure:]_block_invoke244 + 91
    5   libdispatch.dylib                   0x0000000102c9a851 _dispatch_call_block_and_release + 12
    6   libdispatch.dylib                   0x0000000102cad72d _dispatch_client_callout + 8
    7   libdispatch.dylib                   0x0000000102c9d3fc _dispatch_main_queue_callback_4CF + 354
    8   CoreFoundation                      0x00000001023fe289 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    9   CoreFoundation                      0x000000010234b854 __CFRunLoopRun + 1764
    10  CoreFoundation                      0x000000010234ad83 CFRunLoopRunSpecific + 467
    11  GraphicsServices                    0x00000001033e2f04 GSEventRunModal + 161
    12  UIKit                               0x0000000100cace33 UIApplicationMain + 1010
    13  CoffeeKit                           0x0000000100003733 main + 115
    14  libdyld.dylib                       0x0000000102efe5fd start + 1
    15  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

2 个答案:

答案 0 :(得分:0)

正如您从堆栈中看到的那样,您的错误正在发生,因为您尝试访问索引29处的对象,该对象位于数组的边界之外:

  

* - [__ NSArrayM objectAtIndex:]:索引29超出界限[0 .. 28]

在你的情况下,它可能来自这一行:

NSUInteger indexer = index +1;
[temp addObject:[temp objectAtIndex:indexer]];

我假设你正在使用它来获取下一个对象的值。但是,一旦数组到达第28个对象,就会尝试访问虚构的第29个对象。

底线:重构代码,以便只访问存在的对象。

答案 1 :(得分:0)

通过访问数组中的NEXT元素,你有两件事情已经超出界限。你可以直接使用'j'来访问元素(而不是索引,所以你不必自己增加它)你可以改变你的来自

for (int j = 0; j <_venues.count; j++)

for (int j = 0; j <_venues.count-1; j++)

顺便说一句,如果您只需要排序,NSMutableArray提供了许多选项:

Rearranging Content
– exchangeObjectAtIndex:withObjectAtIndex:
– sortUsingDescriptors:
– sortUsingComparator:
– sortWithOptions:usingComparator:
– sortUsingFunction:context:
– sortUsingSelector: