I don't think you are setting a queue for your callback correctly
You assign the callback queue to an operation, but then you create an operation which overwrites it.
// You create the queue
dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
// You declare an operation, but you don't create it.
AFJSONRequestOperation *operation;
// You assign the requestQueue to this uninitialised operation
operation.successCallbackQueue = requestQueue;
// You create the operation here, and it overwrites the requestQueue you have set
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
You should be setting the successCallbackQueue after creating the operation.
Edited to add a bit more
And a bit more reading on my part. With GCD and on Mountain Lion or iOS6 apps, if you use ARC, it takes care of the memory management of queues. So when you declare a queue within a method, and assign it to a property that just assigns the value (as the successCallbackQueue property declares in AFNetworking), then the queue gets released, and the operation doesn't hold on to it, so it's left with a NULL queue and you get the bad access.
So, the way to fix this is to have an iVar in your controller that maintains a strong reference to the queue so even though the operation doesn't retain the queue, your controller will, so it won't get cleaned up from under you.