2015-05-06 1 views
0

Так что я получаю эту ошибку при создании NSDictionary:NSCFNumber escapedString Ошибка с NSDictionary

DLog(@"hiliteID: %@ | regionID: %@", hiliteID, regionID); 

if ([hiliteID isKindOfClass:[NSNumber class]]) { 
    DLog(@"hititeID is a number"); 
} 
if ([hiliteID isKindOfClass:[NSString class]]) { 
    DLog(@"hiliteID is a string"); 
} 
if ([regionID isKindOfClass:[NSNumber class]]) { 
    DLog(@"regionID is a number"); 
} 
if ([regionID isKindOfClass:[NSString class]]) { 
    DLog(@"regionID is a string"); 
} 

NSDictionary *regionDictionary = [NSDictionary dictionaryWithObject:regionID forKey:hiliteID]; 
DLog(@"regionDictionary: %@", regionDictionary); 

id result = [self.serverCall XMLRPCCall:kSaveHilitedObjects withObjects:@[self.mapContext, regionDictionary]]; 

Что вошли:

DEBUG | hiliteID: 160399 | regionID: 950 
DEBUG | hititeID is a number 
DEBUG | regionID is a number 
DEBUG | regionDictionary: { 
    160399 = 950; 
} 
DEBUG -[__NSCFNumber escapedString]: unrecognized selector sent to instance 0x7947f5d0 
DEBUG *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber escapedString]: unrecognized selector sent to instance 0x7947f5d0' 

0x7947f5d0 имеет значение 160399, так что hiliteID.

hiliteID - это возвращаемое значение с нашего сервера и установлено как NSString. Я бросил его в NSNumber:

NSArray *hiliteIDs = [result allKeys]; 

if ([[hiliteIDs firstObject] isKindOfClass:[NSString class]]) { 
    return [NSNumber numberWithInteger:[[hiliteIDs firstObject] integerValue]]; 
} 
else if ([[hiliteIDs firstObject] isKindOfClass:[NSNumber class]]) { 
    return [hiliteIDs firstObject]; 
} 

Насколько я знаю, нет никакой проблемы с тем, что я делаю здесь.

линия:

id result = [self.serverCall XMLRPCCall:kSaveHilitedObjects withObjects:@[self.mapContext, regionDictionary]]; 

Я использовал этот класс десятки раз в коде и никогда не было проблемы.

Что может быть причиной ошибки?

+0

Если вы перезаписываете значения 'regionDictionary' с жестко закодированным ключом/значениями NSString или NSNumber', он все равно падает? – Larme

+0

@ Larme Да, я все равно получаю ту же ошибку. – Padin215

+0

Если вы получаете ошибку с помощью 'NSString', а также с NSNumber, может быть другим параметром, вызывающим проблему. Проверьте значение каждого var. – Larme

ответ

1
reason: '-[__NSCFNumber escapedString]: unrecognized selector sent to instance 0x7947f5d0' 

Кто-то пытается вызвать -escapedString метод из класса NSNumber, так что кажется, что проблема в том, что вы проходя NSNumber аргумент, когда NSString требуется. Попытайтесь использовать только значения NSString внутри вашего NSDictionary.

+0

Однако сервер требует, чтобы они были значениями NSNumber. – Padin215

+0

Это не имеет значения, потому что «XMLRPCCall: withObjects», как вы можете видеть из сообщения об ошибке, преобразует все параметры в экранированные строки перед отправкой. – 4esterUA

+0

Вы правы. Я не думал об этом так далеко. Я устанавливаю ключ в строку и оставляю значение как число, и он работает. Парсер, я думаю, не может обрабатывать ключи NSNumber. Спасибо. – Padin215

1

Независимо от того, что XMLRPCCall:withObjects: вызывает недопустимый метод. Я бы рекомендовал сделать все входы в этот метод в NSStrings, чтобы этот вызов не вызывал внутренние методы на NSNumbers, что NSNumber не может отвечать.

NSString *regionIDString = [regionID stringValue]; 
NSString *hiliteIDString = [hiliteID stringValue]; 
NSDictionary *regionDictionary = [NSDictionary dictionaryWithObject:regionIDString forKey:hiliteIDString];