У меня есть код, распространяемый в библиотеке, который выглядит так:
if ([[NSString class] instancesRespondToSelector: @selector(JSONValue)]) {
NSString *jsonString = [[[NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding] autorelease];
dict = [jsonString performSelector: @selector(JSONValue)];
}
По какой-то причине при вызове метода performSelector:
возникает исключение -[__NSCFString JSONValue]: unrecognized selector sent to instance
. Это код, который распространяется в библиотеке, которую я написал, но я не могу воспроизвести или отладить его самостоятельно. Вместо этого третья сторона сообщает об этой проблеме. При каких условиях instancesRespondToSelector:
при фактическом вызове метода с помощью performSelector:
может генерировать исключение?
edit Существует случай, который мог бы объяснить, почему это происходит, но это не имеет смысла. Если бы разработчики сделали что-то вроде этого:
@implementation NSString (OurHappyCategory)
+ (BOOL)instancesRespondToSelector:(SEL)aSelector
{
return YES;
}
@end
Это объяснило бы, почему код выполняется, но, конечно, это было бы очень плохо. Есть ли смысл в том, чтобы эта проблема могла возникнуть?
JSONValue
—id
. - person ThomasW   schedule 09.04.2013if
? - person Marcelo Fabri   schedule 09.04.2013JSONValue
? Может быть, третья сторона не связывает вашу библиотеку и сама не вызываетJSONValue
? - person Jonathan Cichon   schedule 09.04.2013JSONValue
не передается, поэтому я не думаю, что проблема в этом. Возможно, они изменили поведение классаNSString
, но я не понимаю, почему они это сделали. - person ThomasW   schedule 09.04.2013JSONValue
, что не редкость. - person MaxGabriel   schedule 18.04.2013JSONValue
, которую реализуетNSString
, почему она выдавала бы исключение? - person ThomasW   schedule 18.04.2013-ObjC
, instancesRespondToSelector: вернет NO. Если вы используете флаг-ObjC
, тогдаinstancesRespondToSelector:
вернет YES, и исключение не будет выдано.-all_load
имеет тот же эффект, что и-ObjC
. - person ThomasW   schedule 18.04.2013