【问题标题】:NSURLSessionDataTask, dataTaskWithRequest:completionHandler Issue in IOS12IOS12 中的 NSURLSessionDataTask、dataTaskWithRequest:completionHandler 问题
【发布时间】:2019-03-28 14:18:15
【问题描述】:

在我的 Objective-C、iPhone 应用程序中,我成功使用了 NSURLSession,我的应用程序开始崩溃,并出现以下 iOS 12 错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSConcreteMapTable dataTaskWithRequest:completionHandler:]:无法识别的选择器发送到实例

获取令牌 ==>

+ (NSURLSession *)sharedSessionManager
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setHTTPAdditionalHeaders:@{
                                                  @"Accept": @"application/json"
                                                  }
         ];
session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:nil delegateQueue:nil];
    });
    return session;
}

为所有未来调用获取保存的令牌 ==>

+ (NSURLSession *)sharedAsyncSessionManager
{
    NSString *authToken = [NSString stringWithFormat: @"Bearer %@", m_strToken];
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    NSURLSessionConfiguration *sessionConfiguration =[NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setHTTPAdditionalHeaders:@{
                                                         @"Content-Type": @"application/json",
                                                         @"Authorization": authToken}
         ];
        session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:nil delegateQueue:nil];
    });
    return session;
}

调用 API ==>

NSURLSession *sessionMnger = [SessionManager sharedAsyncSessionManager];

NSURLSessionDataTask *task = [sessionMnger dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
  {
      NSMutableArray *arrTemp = [[NSMutableArray alloc]init];
  }

iOS 12 中 dataTaskWithRequest 的应用程序崩溃。错误消息如下所示:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSConcreteMapTable dataTaskWithRequest:completionHandler:]:无法识别的选择器发送到实例

当我想用上面的 sessionMnger 应用程序崩溃调用 API 时......

iOS 12 中缺少什么?

【问题讨论】:

  • 看起来像内存管理问题,尝试启用“僵尸对象”并再次运行以查看它显示的内容。 (产品->方案->编辑方案->“运行”->诊断子选项卡
  • 我做了同样的事情,应用程序在同一行崩溃。 NSURLSessionDataTask *task = [sessionManger dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) with message [__NSURLSessionLocal dataTaskWithRequest:completionHandler:]: message sent to deallocated instance 0x100c878c0
  • 好的,这很好(有点,启用“僵尸对象”不应该修复它,但揭示崩溃的原因)。所以你的 sessionMnger 被提前释放了。我看不出你的代码是怎么发生的。您确定您没有遗漏代码 sn-ps 中的相关内容吗?这两条线(您获得 sessionMnger 并使用它的那条线)是否相互跟随,中间没有任何东西?
  • 您好,非常感谢您的帮助,我已将 -fno-objc-arc(构建阶段)添加到 SessionManager 类。一旦我删除它,它就会保留全局会话(现在基本测试工作正常。)。太感谢了。能否请您添加为答案,我会投票,以便对其他人有所帮助。

标签: objective-c iphone ios12


【解决方案1】:

通常当您收到带有不相关类名的“无法识别的选择器发送到实例”错误时(在这种情况下为NSConcreteMapTable),这表明内存管理问题。很可能原始对象已被释放,内存已损坏并且运行时混乱。

要进行诊断,请尝试从方案菜单中启用“僵尸对象”,这将有助于确定崩溃原因。寻找可能发生内存损坏的线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多