如何在Objective-C中复制对象 [英] How to copy an object in Objective-C

查看:97
本文介绍了如何在Objective-C中复制对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要深度复制具有自己对象的自定义对象.我一直在阅读,对于如何继承NSCopying和如何使用NSCopyObject感到有些困惑.

I need to deep copy a custom object that has objects of its own. I've been reading around and am a bit confused as to how to inherit NSCopying and how to use NSCopyObject.

推荐答案

与引用类型一样,复制"有两个概念.我确定您了解它们,但出于完整性考虑.

As always with reference types, there are two notions of "copy". I'm sure you know them, but for completeness.

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

您想要后者.如果这是您自己的对象之一,则只需采用协议NSCopying并实现-(id)copyWithZone:(NSZone *)zone.您可以自由地做任何您想做的事.尽管您的想法是您制作自己的真实副本并返回.您可以在所有字段上调用copyWithZone进行深拷贝.一个简单的例子是

You want the latter. If this is one of your own objects, you need simply adopt the protocol NSCopying and implement -(id)copyWithZone:(NSZone *)zone. You're free to do whatever you want; though the idea is you make a real copy of yourself and return it. You call copyWithZone on all your fields, to make a deep copy. A simple example is

@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;
}

这篇关于如何在Objective-C中复制对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆