objective-c - 如何在 Objective-C 中复制对象

我需要深度复制一个拥有自己对象的自定义对象。我一直在阅读,对于如何继承 NSCopying 以及如何使用 NSCopyObject 有点困惑。

最佳答案

与引用类型一样,“复制”有两个概念。我相信你知道他们,但为了完整性。

  1. 按位复制。在这里,我们只是逐位复制内存——这就是 NSCopyObject 所做的。几乎总是,这不是你想要的。对象具有内部状态、其他对象等,并且经常假设它们是唯一持有对该数据的引用的对象。按位复制打破了这一假设。
  2. 深度、合乎逻辑的副本。在这种情况下,我们制作了一个对象的副本,但实际上并没有一点一点地做——我们想要一个在所有意图和目的上都表现相同的对象,但不是(必然)原始的内存相同的克隆—— Objective C 手册将这样的对象称为“功能独立”的对象。因为制作这些“智能”副本的机制因类而异,所以我们要求对象本身来执行它们。这是 NSCopying 协议(protocol)。

你想要后者。如果这是您自己的对象之一,您只需采用协议(protocol) NSCopying 并实现 -(id)copyWithZone:(NSZone *)zone。你可以自由地做任何你想做的事;尽管这个想法是您制作自己的真实副本并将其归还。您在所有字段上调用 ​​copyWithZone 以进行深层复制。一个简单的例子是

@interface YourClass : NSObject <NSCopying> 
{
   SomeOtherObject *obj;
}

// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
  // We'll ignore the zone for now
  YourClass *another = [[YourClass alloc] init];
  another.obj = [obj copyWithZone: zone];

  return another;
}

https://stackoverflow.com/questions/1459598/

相关文章:

objective-c - 最佳实践 - 您自己的项目/应用程序的 NSError 域和代码

c++ - 从 C++ 成员函数调用 Objective-C 方法?

ios - 我如何通过 Foundation 获取星期几?

iphone - 使用 Core Data 实现枚举的最佳方法

ios - 从文档目录中删除指定文件

ios - Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价

objective-c - 何时使用 -retainCount?

iphone - Objective C中变量位置的声明/定义?

ios - Xcode MyProjectName-Bridging-Header.h 不存在

iphone - Apple 怎么知道你在使用私有(private) API?