0

这是我的场景。现在,我的大多数网络调用都需要在发出请求时将 api 密钥插入到标头字段中。所以我想我能做的就是创建一个 NSMutableUrlRequest 类别。覆盖其中一个初始化程序。然后在那个初始化程序中,我可以将 api 键设置为标题字段。所以每次我创建一个 NSMUTABLEURLREQUEST 对象时,我需要的标题字段已经设置好了。如果您在这里查看苹果文档NSMutableUrlRequest,您可以看到该对象有 4 个初始化程序、2 个类和 2 个实例方法。生病列出我的问题

  1. 为了完成我的任务,我应该重写什么初始化函数?类还是实例?
  2. 我怎样才能覆盖它?如果它是一个实例或类初始化器?
  3. 这甚至是一个好方法吗?还是我应该将它子类化并像那样覆盖它?

我的代码已经写了一段时间了,我不想回去将 api 密钥插入每个单独的请求,因为它们有很多。在某种程度上,我认为这是一种更好的方法,因为我只需将 apiKey 设置在一个地方而不是很多地方,这减少了编程错误的可能性。谢谢你的帮助。

PS 即使这不是完成此任务的好方法,有人仍然可以向我展示类初始化程序是如何工作的吗?就像底层代码一样,所以我也可以生成自己的静态类初始化程序。每次我尝试重写类方法时,我都不知道要返回什么类型。

感谢您的帮助

4

1 回答 1

1

类别不是用来覆盖的。当您想向现有类添加附加功能时,您可以使用类别。如果您真的想覆盖初始化程序,请使用继承。

静态函数不是初始化器,它们只是为您创建实例的辅助函数,因此无需处理它们。simpleinitWithURL:方法只是一个简化版本,它为指定的初始化器提供默认值initWithURL:cachePolicy:timeoutInterval:;所以在你的子类中你实际上只需要重写这个单一的初始化器,看起来像这样:

@interface MyNSMutableURLRequest : NSMutableURLRequest
@end

@implementation MyNSMutableURLRequest

- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval {
    self = [super initWithURL:URL cachePolicy:cachePolicy timeoutInterval:timeoutInterval];
    if (self) {
        //do your stuff here
    }
    return self;
}
于 2016-01-29T15:21:22.163 回答