Objective-C NSMutableArray: removeObjectsInRange - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть NSMutableArray с именем rawData размером 198792. Каждый индекс содержит объект NSObject с именем DataSet. Интерфейс для DataSet выглядит следующим образом:

@interface DataSet : NSObject {
NSNumber *rightFoot;
NSNumber *leftFoot;
}

Я пытаюсь обрезать rawData, используя следующую строку кода:

[rawData removeObjectsInRange:NSMakeRange(0, StartTime*freq-1)];

, где StartTime * freq-1 = 11799.

Я получаю ошибку во время выполнения: * Завершение работы приложения из-за неперехваченного исключения 'NSRangeException', причина: '* - [NSMutableArray objectAtIndex:]: индекс 198791 за пределами [0 .. 186992]'

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: трассировка стека

2012-02-16 17:59:31.671 fwd_analysis[8154:207] *** Terminating app due to uncaught    
exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index    
198791 beyond bounds [0 .. 186992]'

*** Call stack at first throw:

(

0   CoreFoundation                      0x00dc25a9 __exceptionPreprocess + 185

1   libobjc.A.dylib                     0x00f16313 objc_exception_throw + 44

2   CoreFoundation                      0x00db80a5 -[__NSArrayM objectAtIndex:] + 261

3   fwd_analysis                        0x00002a99 -[fwd_analysisViewController      startButtonPressed:] + 252

4   UIKit                               0x002b24fd -[UIApplication sendAction:to:from:forEvent:] + 119

5   UIKit                               0x00342799 -[UIControl sendAction:to:forEvent:] + 67

6   UIKit                               0x00344c2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527

7   UIKit                               0x003437d8 -[UIControl touchesEnded:withEvent:] + 458

8   UIKit                               0x002d6ded -[UIWindow _sendTouchesForEvent:] + 567

9   UIKit                               0x002b7c37 -[UIApplication sendEvent:] + 447

10  UIKit                               0x002bcf2e _UIApplicationHandleEvent + 7576

11  GraphicsServices                    0x0171a992 PurpleEventCallback + 1550

12  CoreFoundation                      0x00da3944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52

13  CoreFoundation                      0x00d03cf7 __CFRunLoopDoSource1 + 215


14  CoreFoundation                      0x00d00f83 __CFRunLoopRun + 979

15  CoreFoundation                      0x00d00840 CFRunLoopRunSpecific + 208

16  CoreFoundation                      0x00d00761 CFRunLoopRunInMode + 97

17  GraphicsServices                    0x017191c4 GSEventRunModal + 217

18  GraphicsServices                    0x01719289 GSEventRun + 115

19  UIKit                               0x002c0c93 UIApplicationMain + 1160

20  fwd_analysis                        0x00002758 main + 102

21  fwd_analysis                        0x000026e9 start + 53

)

terminate called after throwing an instance of 'NSException'

Current language:  auto; currently objective-c

Program received signal:  “SIGABRT”.

1 Ответ

2 голосов
/ 17 февраля 2012

Ваш массив не может быть такого размера, как вы думаете.

Посмотрите на сообщение об ошибке: index beyond bounds [0 .. 186992].Поэтому размер вашего массива на самом деле равен 186993.

Я бы также порекомендовал вам записать значение StartTime*freq-1 во время выполнения и сравнить его с длиной вашего массива.

Кроме того, кое-чтоЭто может вызвать проблемы в том, что это изменяемый массив, и вы удаляете из него вещи, поэтому длина будет меняться во время выполнения.Вот почему я рекомендую регистрировать и длину и диапазон в точке, где код нарушается.

Итак, что-то вроде этого:

NSLog(@"Length: %i",[rawData length]);
NSLog(@"Range: %i",StartTime*freq-1);
[rawData removeObjectsInRange:NSMakeRange(0, StartTime*freq-1)];

Обновление: как добавлять объекты в другой массив вместо удаления из текущего.

Этот метод необходимо использовать, чтобы получить массив, содержащий объекты в определенном диапазоне:

- (NSArray *)subarrayWithRange:(NSRange)range

Затем вы можете добавить эти объекты в другой массив, например:

// before you did this:
[rawData removeObjectsInRange:NSMakeRange(0, StartTime*freq-1)];
// to create a filtered array do:
NSArray *filtered = [rawData subarrayWithRange:NSMakeRange(0, StartTime*freq-1)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...