Я получаю следующее сообщение об ошибке, которое вызывает SIGABRT
:Почему iOS попытается вызвать rangeOfCharacterFromSet: на NSIndexPath?
2015-09-10 17:54:23.859 MyApp[1310:2027719] ERROR CRASH #(null) -[NSIndexPath rangeOfCharacterFromSet:]: unrecognized selector sent to instance 0xc000000000000016
2015-09-10 17:54:23.879 MyApp[1310:2027719] ERROR Stack Trace: (
0 CoreFoundation 0x0000000183840248 <redacted> + 160
1 libobjc.A.dylib 0x00000001952640e4 objc_exception_throw + 60
2 CoreFoundation 0x00000001838472f4 <redacted> + 0
3 CoreFoundation 0x00000001838440a8 <redacted> + 928
4 CoreFoundation 0x000000018374696c _CF_forwarding_prep_0 + 92
5 UIKit 0x0000000188632a44 <redacted> + 104
6 UIKit 0x00000001887a0ff0 <redacted> + 76
7 UIKit 0x00000001887a10b0 <redacted> + 56
8 UIKit 0x00000001887a1194 <redacted> + 36
9 QuartzCore 0x0000000187bf0820 <redacted> + 320
10 QuartzCore 0x0000000187bf06c4 <redacted> + 32
11 QuartzCore 0x0000000187befe58 <redacted> + 276
12 QuartzCore 0x0000000187befbd8 <redacted> + 528
13 QuartzCore 0x0000000187be9300 <redacted> + 80
14 CoreFoundation 0x00000001837f7ff0 <redacted> + 32
15 CoreFoundation 0x00000001837f4f7c <redacted> + 360
16 CoreFoundation 0x00000001837f535c <redacted> + 836
17 CoreFoundation 0x0000000183720f74 CFRunLoopRunSpecific + 396
18 GraphicsServices 0x000000018d0436fc GSEventRunModal + 168
19 UIKit 0x0000000188322d94 UIApplicationMain + 1488
20 MyApp 0x00000001000437b0 main + 68
21 libdyld.dylib 0x000000019590ea08 <redacted> + 4
, который выглядит как IOS пытается отправить сообщение на NSString
селектор, но сообщение было отправлено на NSIndexPath
. Weird!
С тех пор я нашел проблему; Я установил бы значение текста в UILabel
как указатель на объект в столбце NSNumber
объекта CoreData вместо NSString
. Мое исправление было добавлено .intValue
в NSNumber
, прежде чем передать его моему методу enumToString:
.
typedef NS_ENUM(NSInteger, MyEnum)
{
MyEnum1 = 1,
MyEnum2,
MyEnum3
};
- (NSString*)enumToString:(MyEnum)enumValue
{
switch (enumValue) {
case MyEnum1:
return @"One";
case MyEnum2:
return @"Two";
case MyEnum3:
return @"Three";
}
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
// cdObject is a managed object in CoreData. Its enumValue column is an NSNumber.
cell.textLabel.text = [self enumToString:cdObject.enumValue];
return cell;
}
Это просто оставляет вопрос: Почему это причина IOS, чтобы попытаться отправить сообщение на несуществующий селектор -[NSIndexPath rangeOfCharacterFromSet:]
?
Катастрофа произошла сразу после заканчивания -[UITableViewDataSource tableView:cellForRowAtIndexPath:]
Вы должны разместить соответствующий код, поскольку кажется, что ошибка может также быть на вашей стороне, поскольку вы могли бы передать неправильный тип объекта какао в первую очередь, что часто бывает в случае с этими «почему система делает сумасшедшие вещи», ошибки в проверке типов довольно бывают в objc только во время выполнения, поэтому компилятор может не полностью избавить вас от этого, поэтому swift гораздо более строгий по типам, чтобы предотвратить такие ситуации – PetrV
@ PetrV Я добавил пример кода. –
Реальным случаем является то, что кто-то отправляет сообщение указателю на объект. Однако этот указатель больше не является указателем на ваш NSString, но был повторно использован и теперь указывает на NSIndexPath. Это может быть следствием неожиданного освобождения (включить зомби, чтобы это выяснить), или вы обрабатываете объекты через потоки, а где-то есть часть, которая небезопасна. Если это так, вы получите эту проблему не каждый раз, а только один раз каждый раз, когда вы запускаете. – Joride