当我的ViewController导航应用程序崩溃时AFURLSessionManager

时间:2017-08-19 07:03:53

标签: ios objective-c iphone xcode8 afnetworking

我在Objective-C iOS的AFURLSessionManager中遇到问题。我有2个viewController,并使用AFURLSessionManager从服务器获取getData。

当用户导航到具有AFURLSessionManager请求的viewContoller2且用户网络非常差并按下后退按钮时,AFURLSessionManager想要调用委托,崩溃并显示 EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

Crash image

当我导航到viewController时,AFURLSessionManager任务完成延迟,viewController被用户更改,AFURLSessionManager尝试调用委托不存在于MEMORY中。

任何人有任何想法解决这个问题吗?

这是请求代码:

- (void) getData
{
    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"GET" URLString:@"http://----------" parameters:nil error:nil];

    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    req.timeoutInterval= 15;
    [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [req setValue:@"application/json" forHTTPHeaderField:@"Accept"];

    self.dataTask = [manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error)
     {

         if (!error)
         {
             NSLog(@"Reply JSON >>>>>> responseObject <<<<<: %@", responseObject);


             if ([responseObject isKindOfClass:[NSDictionary class]])
             {
                 if (self.delegate && [self.delegate respondsToSelector:@selector(success:)]) {
                     [self.delegate success:responseObject];
                 }
                 //                  self.colorView.backgroundColor = [UIColor blueColor];
                 return;
             }
             else
             {
                 NSLog(@"Error No dictionary: %@, %@, %@", error, response, responseObject);
                 {
                     //                      self.colorView.backgroundColor = [UIColor redColor];
                     [self.delegate error:error];
                     return;
                 }

             }
         }
         else
         {
             NSLog(@"Error: %@, %@, %@", error, response, responseObject);
             [self.delegate error:error];
             return;

         }

     }];

    [self.dataTask resume];

    if (self.cancelRequest) {
        [self.dataTask cancel];
    }
}

头文件:

@protocol WebServicesDelegate <NSObject>

- (void) success:(NSDictionary *) dic;
- (void) error:(NSError *) error;

@end

@interface WebServices : NSObject

@property (assign,nonatomic) id<WebServicesDelegate> delegate;
@property (nonatomic) BOOL cancelRequest;

-(void) setCancelRequest:(BOOL)cancelRequest;
//+(instancetype) shareInstance;

- (void) getData;

@end

提前致谢

2 个答案:

答案 0 :(得分:2)

调试self.delegate是什么。绝对不是零,否则它不会崩溃。

因为self.delegate不是NSObject子类而崩溃了。它可以是标量或一些垃圾值。

我猜你在声明委托时使用了assign而不是weak,因为它被分配了,它会导致悬空指针。

编辑(问题更新后) 变化

@property (assign,nonatomic) id<WebServicesDelegate> delegate;

@property (weak,nonatomic) id<WebServicesDelegate> delegate;

答案 1 :(得分:1)

问题可能与self一致,因为您的webservice是异步的,所以当响应来了,你已经通过pop或dismiss删除了那个viewcontroller

你应该使用__weak typeof(self) weakSelf = self;

并在weakSelf

的地方使用self

希望它有助于解决您的问题