Ios NSURLSessionTaskDelegate是什么时候设置的?

Ios NSURLSessionTaskDelegate是什么时候设置的?,ios,nsurlsession,Ios,Nsurlsession,我刚刚学习了使用NSURLSession API,我发现在创建这样的会话时,我们只是设置了NSURLSessionDelegate self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue]; 我们没有设置NSURLSessionAskDelegate,但是也会调用NSURLSessionAskDe

我刚刚学习了使用NSURLSession API,我发现在创建这样的会话时,我们只是设置了NSURLSessionDelegate

self.session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration delegate:self delegateQueue:self.operationQueue];
我们没有设置NSURLSessionAskDelegate,但是也会调用NSURLSessionAskDelegate方法,似乎系统会在符合NSURLSessionLegate的对象上调用NSURLSessionAskDelegate方法

更新演示代码
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
//加载视图后,通常从nib执行任何其他设置。
NSURLSessionConfiguration*配置=[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession*session=[NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSURLSessionDataTask*task=[session dataTaskWithURL:[NSURL URLWithString:@]https://www.baidu.com"]];
[任务恢复];
}
-(无效)未收到记忆警告{
[超级记忆警告];
//处置所有可以重新创建的资源。
}
-(void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务未完成错误:(NSError*)错误
{
}

如果我理解正确,您的意思是您创建了一个类,该类实现了
协议中的方法,但您只声明它实现了
协议。然后,在创建会话时,您将其作为委托传递,并且您对为什么还调用会话任务委托方法感到困惑

首先,每个会话只有一个代理。它处理与会话相关的事件和与任务相关的事件。委托方法被分组到多个协议中,以便于记录和理解。任务和会话委托方法之间的区别没有运行时意义

NSURLSession
类由苹果公司预编译。它不是使用您的头编译的,因此它不知道您传入的类对象的头是否有装饰。这些修饰只有在告诉编译器类应该包含这些方法的上下文中才有意义。如果将该类的实例传递给一个方法,该方法的参数类型表示传入的对象必须符合
协议,而您的类不符合,则编译将失败。类似地,如果协议中缺少必需的方法,则编译类将失败。然而,除了这两个目的之外,这些装饰基本上只是为了程序员的利益

此外,由于所有的
NSURLSession
委托方法都是可选的,因此会话不能假定其委托将基于其声称遵守的协议支持任何特定方法

由于这些原因,在运行时级别,会话通过询问委托对象是否支持每个委托方法来确定是否调用该方法。如果它说“是”,则会话调用该方法


由于您的类同时提供任务和会话委托方法的实现,当被问及是否支持这些方法时,该类会自动回答“是”,因此
NSURLSession
会在适当的时间调用它们。

如果我理解正确,您要说的是,您创建了一个类,该类实现了
协议中的方法,但您只声明它实现了
协议。然后,在创建会话时,您将其作为委托传递,并且您对为什么还调用会话任务委托方法感到困惑

首先,每个会话只有一个代理。它处理与会话相关的事件和与任务相关的事件。委托方法被分组到多个协议中,以便于记录和理解。任务和会话委托方法之间的区别没有运行时意义

NSURLSession
类由苹果公司预编译。它不是使用您的头编译的,因此它不知道您传入的类对象的头是否有装饰。这些修饰只有在告诉编译器类应该包含这些方法的上下文中才有意义。如果将该类的实例传递给一个方法,该方法的参数类型表示传入的对象必须符合
协议,而您的类不符合,则编译将失败。类似地,如果协议中缺少必需的方法,则编译类将失败。然而,除了这两个目的之外,这些装饰基本上只是为了程序员的利益

此外,由于所有的
NSURLSession
委托方法都是可选的,因此会话不能假定其委托将基于其声称遵守的协议支持任何特定方法

由于这些原因,在运行时级别,会话通过询问委托对象是否支持每个委托方法来确定是否调用该方法。如果它说“是”,则会话调用该方法


因为您的类为任务和会话委托方法都提供了实现,所以当被问及是否支持这些方法时,该类会自动回答“是”,因此
NSURLSession
会在适当的时间调用它们。

这不应该发生。请发布调用的委托方法。@New16,我只添加了演示代码,并且-(void)URLSession:(NSURLSession*)会话任务:(NSURLSessionTask*)任务didCompleteWithError:(NSError*)错误将被调用,即使我没有设置任务委托。根据这一点,默认情况下它将调用这些委托。因此,会话委托对象似乎也必须是sesstion任务委托?因此,您有cre
#import "ViewController.h"

@interface ViewController ()<NSURLSessionDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
    
    NSURLSession* session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
    
    NSURLSessionDataTask* task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
    
    [task resume];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    
}