【问题标题】:how can I deep-copy an NSMutableURLRequest?如何深度复制 NSMutableURLRequest?
【发布时间】:2012-11-20 21:24:13
【问题描述】:

Apple 在NSMutableURLRequest 上的 iOS 文档说:

NSURLConnection 对每个 NSMutableURLRequest 对象进行深拷贝 传递给它的初始化器之一。

这是如何实现的?我没有看到任何记录在案的方式来执行 NSMutableURLRequest 对象的深层复制。逐字段复制不够好,因为NSMutableURLRequest 可以被子类化。

我的用例:我正在为构建在 http 之上的自定义协议实现 NSURLProtocol。我的 NSURLProtocol 实现将执行其自定义内容,然后使用 NSURLConnection 和稍微修改的 NSURLRequest

【问题讨论】:

  • NSMutableURLRequest 实现了 NSCopying 和 NSMutableCopying 协议,你可能应该使用 copy 方法来创建深拷贝
  • @phix23: copy 通常不执行深层复制。
  • 我测试了 NSURLConnection 发现它根本没有创建请求的副本。我使用属性 originalRequest 和 currentRequest 并使用 NSLog(@"request: %p", request) 记录它们。
  • @phix23 它只复制可变变体。你测试过哪个?在我的测试中,它创建了我的可变请求的不可变副本。

标签: ios cocoa nsurlrequest nsurlprotocol


【解决方案1】:

当您想要制作对象的深层副本时,您可以使用 NSKeyedArchiver。

基本上使用 NSKeyedArchiver 将对象保存到 NSData 对象中

使用 NSKeyedUnarchiver

将其加载回来

【讨论】:

  • 这显然不是它使用的——我创建了一个 NSMutableURLRequest 子类并覆盖了所有用于 NSCopying、NSMutableCopying 和 NSCoding 的方法(以及其他一些随机猜测),但没有一个被调用。因此,它要么使用了一些非常有特色的东西(因此可能不安全地进行子类化),要么文档不准确并且实际上并没有制作副本。我怀疑是后者。
  • 我不确定你的意思,但我没有说 NSCopying 使用这个。我是说您可以使用它来制作深层副本。我什至不明白你为什么要覆盖这些方法,它们是依赖于类的,并且会复制每个类中被认为相关的属性,这就是为什么结果会因你使用它而有所不同。
  • @WadeTregaskis:你可能是对的,子类化是不安全的;我刚刚注意到文档说如果你想为你的自定义协议添加属性,你应该这样做“使用 NSURLProtocol 的 propertyForKey:inRequest: 和 setProperty:forKey:inRequest: 方法”。至于实际复制:复制,这是肯定的。
  • @LuisOscar 我的问题有点暗示我想知道“他们”在做什么。但实际上,您的回答确实回答了标题中的问题,尽管 NSMutableCopying 似乎会以更好的方式解决我的特定问题。
  • @noamtm 我以为你已经尝试过这种方法,但你仍然没有得到你想要的一切。复制和做这个之间的区别在于,当你复制你“模仿”对象时,这个真的复制了它所拥有的一切。 nsmutablecopy 虽然不是深拷贝。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多