ios - 当我的 ViewController 被导航时,AFURLSessionManager 应用程序崩溃了

标签 ios objective-c iphone xcode8 afnetworking

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

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

Crash image

当我导航到 viewController 时,AFURLSessionManager 任务完成较晚,并且 viewController 被用户更改,AFURLSessionManager 尝试调用内存中不存在的委托(delegate)。

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

这是请求代码:

- (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

提前致谢

最佳答案

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

它崩溃了,因为 self.delegate 不是 NSObject 子类。它要么是标量,要么是一些垃圾值。

我猜你用过assign而不是 weak在声明委托(delegate)时,因为它已被分配,它会导致一个悬空指针。

编辑 (问题更新后)
改变

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


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

关于ios - 当我的 ViewController 被导航时,AFURLSessionManager 应用程序崩溃了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768730/

相关文章:

ios - NSURLRequest超时间隔默认时间

iphone - 如何在 Cocoa Touch 中对字符串进行 base64url 编码

android - 在单个对话窗口中获取 facebook 读写权限

ios - 如何同时录制视频和播放音频(swift教程)

ios - libsqlite3.dylib 框架意外从 xcode 中删除

ios - 滚动 tableview 会删除 uitableview 单元格中的复选标记

iphone - UIWebView 未加载页面

iphone - 如何获取 UITextField 的 textDidChange (如 UISearchBar)方法?

objective-c - 检查正在使用的应用程序版本

iphone - iPhone程序在 float 到字符串转换时崩溃