Slide 27
Slide 27 text
NSData * AFJSONEncode(id object, NSError **error) {
NSData *data = nil;
SEL _JSONKitSelector = NSSelectorFromString(@"JSONDataWithOptions:error:");
SEL _YAJLSelector = NSSelectorFromString(@"yajl_JSONString");
id _SBJsonWriterClass = NSClassFromString(@"SBJsonWriter");
SEL _SBJsonWriterSelector = NSSelectorFromString(@"dataWithObject:");
id _NXJsonSerializerClass = NSClassFromString(@"NXJsonSerializer");
SEL _NXJsonSerializerSelector = NSSelectorFromString(@"serialize:");
id _NSJSONSerializationClass = NSClassFromString(@"NSJSONSerialization");
SEL _NSJSONSerializationSelector = NSSelectorFromString(@"dataWithJSONObject:options:error:");
#ifdef _AFNETWORKING_PREFER_NSJSONSERIALIZATION_
if (_NSJSONSerializationClass && [_NSJSONSerializationClass respondsToSelector:_NSJSONSerializationSelector]) {
goto _af_nsjson_encode;
}
#endif
if (_JSONKitSelector && [object respondsToSelector:_JSONKitSelector]) {
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[object
methodSignatureForSelector:_JSONKitSelector]];
invocation.target = object;
invocation.selector = _JSONKitSelector;
NSUInteger serializeOptionFlags = 0;
[invocation setArgument:&serializeOptionFlags atIndex:2]; // arguments 0 and 1 are self and _cmd respectively,
automatically set by NSInvocation
if (error != NULL) {
[invocation setArgument:error atIndex:3];
}
[invocation invoke];
[invocation getReturnValue:&data];
} else if (_SBJsonWriterClass && [_SBJsonWriterClass instancesRespondToSelector:_SBJsonWriterSelector]) {
id writer = [[_SBJsonWriterClass alloc] init];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[writer
methodSignatureForSelector:_SBJsonWriterSelector]];
invocation.target = writer;
invocation.selector = _SBJsonWriterSelector;
[invocation setArgument:&object atIndex:2]; // arguments 0 and 1 are self and _cmd respectively, automatically set
by NSInvocation
[invocation invoke];
[invocation getReturnValue:&data];
[writer release];