EXC BAD访问RestKit

时间:2012-08-20 12:33:10

标签: objective-c ios xcode restkit

    In ClassA.h
    @interface ClassA : NSObject<RKObjectLoaderDelegate,RKRequestDelegate>
    @property(nonatomic,strong)NSMutableDictionary *inputDict;

     ClassA.m
//After Implementation
      @synthesize inputDict;

        -(void)sendRequestWithInputDict:(NSMutableDictionary*)inputDictVal
        {
        RKURL *baseURL = [RKURL URLWithBaseURLString:baseUrl];
           RKObjectManager * manager = [RKObjectManager objectManagerWithBaseURL:baseURL];  
            [manager setClient:[RKClient sharedClient]];


            manager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
            RKObjectLoader *objectLoader = [manager loaderWithResourcePath:@"/getLocation"];  
            objectLoader.serializationMIMEType = RKMIMETypeJSON;
            objectLoader.method = RKRequestMethodPOST;
            objectLoader.params = inputDictVal;
            objectLoader.delegate = self;
            [objectLoader send];
        }

     -(void)getLocation
   {
      inputDict = [[NSMutableDictionary alloc]init];
     [self sendRequest:inputDict];
   }

baseUrl在我在此处导入的常量文件中声明。 我试图从另一个类调用sendRequest函数。但是我在requestWillPrepareForSend(RKRequest.m)中得到了一个EX_BAD_ACCESS。

我认为某个对象会自动释放。我不知道是哪一个......

3 个答案:

答案 0 :(得分:0)

查看实例变量baseUrlinputDict始终使用属性而不是实例变量,您将永远不会遇到此类问题。

答案 1 :(得分:0)

您的代码有很多问题。最明显的是不保留对象管理器(除非这成为共享管理器)另一个是尝试加载对象但使用POST。虽然,根据您报告的错误判断,我认为您的ClassA实例正在被释放,并且因为它被设置为委托,您将获得EXC_BAD_ACCESS。我建议你转向使用基于块的方法而不是委托回调。

答案 2 :(得分:0)

通过使用Blocks,我可以向服务器发送请求并从中获取响应。我在这里找到了很好的教程http://kalapun.com/blog/2012/05/17/how-i-restkit/

-(void)sendRequest:(NSMutableDictionary*)inputDict withResourcePath:(NSString*)resourcePath
{
     RKURL *baseURL = [RKURL URLWithBaseURLString:baseUrl];
        RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:baseURL];  
        [manager setClient:[RKClient sharedClient]];


        [manager loadObjectsAtResourcePath:resourcePath usingBlock:^(RKObjectLoader *objectLoader){


        objectLoader.method = RKRequestMethodPOST;
        objectLoader.params = inputDict;

        objectLoader.onDidFailWithError = ^(NSError *error){

        NSLog(@"Error: %@", [error localizedDescription]);

        };
        objectLoader.onDidLoadResponse = ^(RKResponse *response) {
            NSLog(@"response: %@", [response bodyAsString]);
        };


    }];
}