2015-09-10 3 views
1

Я получаю следующее сообщение об ошибке, которое вызывает 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:]

+0

Вы должны разместить соответствующий код, поскольку кажется, что ошибка может также быть на вашей стороне, поскольку вы могли бы передать неправильный тип объекта какао в первую очередь, что часто бывает в случае с этими «почему система делает сумасшедшие вещи», ошибки в проверке типов довольно бывают в objc только во время выполнения, поэтому компилятор может не полностью избавить вас от этого, поэтому swift гораздо более строгий по типам, чтобы предотвратить такие ситуации – PetrV

+0

@ PetrV Я добавил пример кода. –

+0

Реальным случаем является то, что кто-то отправляет сообщение указателю на объект. Однако этот указатель больше не является указателем на ваш NSString, но был повторно использован и теперь указывает на NSIndexPath. Это может быть следствием неожиданного освобождения (включить зомби, чтобы это выяснить), или вы обрабатываете объекты через потоки, а где-то есть часть, которая небезопасна. Если это так, вы получите эту проблему не каждый раз, а только один раз каждый раз, когда вы запускаете. – Joride

ответ

1

Итак, причина, скорее всего, не какой-то пошло не так нарезание резьбы. Core Data превращает NSManagedObjects в неисправности в какой-то момент. Это может быть связано. Кроме того, NSNumbers являются особыми объектами: указатель является помеченным указателем, и этот помеченный указатель может содержать фактическое числовое значение. Это также может быть связано. В любом случае сообщение было отправлено указателю, и этот указатель больше не указывает на объект, который распознает это сообщение. Читайте здесь о помеченных указателях: https://www.mikeash.com/pyblog/friday-qa-2012-07-27-lets-build-tagged-pointers.html