问题标签 [nscopying]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1739 浏览

objective-c - NSCopyObject 被认为是有害的?

在 Xcode 文档中NSCopyObject,特殊注意事项部分指出:

这个功能很危险,而且很难正确使用。它被任何可以子类化的类作为一部分使用copyWithZone:,非常容易出错。在 GC 下或使用 Objective-C 2.0 时,该区域被完全忽略。

Mac OS X 10.6 之后可能会弃用此功能。

为什么很难正确使用?它执行浅(逐位)复制。对象不会被复制或保留。文档对此非常清楚。

如果我没有错过其他原因,那么执行对象浅拷贝的首选方法是什么?

编辑:

执行浅拷贝是有正当理由的。一个例子:一个类可能有许多实例变量,其中大多数是原始类型(整数、浮点数)或故意不保留以避免保留循环的对象(委托)。NSCopyObject使用在一个漂亮的、自我记录的代码行中复制所有这些的浅拷贝。任何需要引用计数的剩余 ivars 都可以单独保留或复制。

对此的替代方法是使用指针语法 ( newObject->ivar = ivar) 分配给新对象,或者创建一个具有可能大量参数的 init 方法(每个 ivar 复制一个)。后者让我觉得特别难看,但我认为它不需要出现在标题中并暴露给世界。

0 投票
1 回答
599 浏览

iphone - 复制 NSMutableArray 项

我正在复制一个像这样的可变数组:

数组中的项目像这样实现 copyWithZone:

但是, playerList 似乎只有“超出范围”的对象。我究竟做错了什么?

0 投票
3 回答
56556 浏览

iphone - 实施 NSCopying

我已经阅读了NSCopying文档,但我仍然不确定如何实现所需的内容。

我的班级Vendor

该类Vendor有一个名为 的对象数组Car

我的Car对象:

所以,Vendor持有一个对象数组CarCar包含 2 个其他自定义对象的数组。

两者都是从字典中初始化的VendorCar我将添加其中一种方法,它们可能相关也可能不相关。

所以总结一下这个可怕的问题。

我需要复制一组Vendor对象。我相信我需要在 上实现NSCopying协议Vendor,这可能意味着我也需要在上实现它,Car因为它Vendor拥有一个 s 数组Car。这意味着我还需要在属于该Car对象的 2 个数组中保存的类上实现它。

如果我能得到一些关于在 上实现NSCopying协议的指导,我将非常感激Vendor,我在任何地方都找不到任何教程。

0 投票
1 回答
200 浏览

objective-c - 递归创建对象并从所述对象的数组中复制特定对象

所以,我在我的编程项目上有点挣扎。

我有一个存储玩家信息、姓名、胜利、失败的对象。

我继续在另一个对象(括号)中使用该对象,该对象设置播放器信息的值,在每个循环之后,它将播放器对象复制到括号类中的 NSMutable。

在括号类中,我有一个打印信息的方法,这很容易弄清楚。

现在,为了生成下一个括号会发生什么,我设置了一个方法,当它完成复制谁输赢时将返回一个括号。

我已经在同一个括号方法中完成了所有这些操作,因此我可以尽可能轻松地访问数据。我如何简单地复制播放器对象并将其添加到新括号中?

当我尝试打印刚刚生成的括号时,我发现我只是得到垃圾值或什么都没有。这是我遇到问题的功能。

所以,我认为这会奏效。它编译得很好(我收到了一些警告,但它是关于整数的,所以我主要用于逻辑)。

谢谢你!

0 投票
1 回答
6544 浏览

objective-c - 在子类的子类中实现 NSCopying

我有一个小的类层次结构,我无法实现copyWithZone:。我已阅读 NSCopying 文档,但找不到正确答案。

参加两个课程:ShapeSquare。正方形定义为:

那里并不奇怪。每个类都有一个属性,Shape 有一个“sides”int,Square 有一个“width”int。copyWithZone:方法见下:

形状

正方形

查看文档,这似乎是做事的“正确”方式。

它不是。

如果您尝试设置/访问该copyWithZone:方法返回的 Square 的 width 属性,它将失败并出现类似于以下错误的错误:

调用[super copyWithZone:zone];Square 方法实际上返回一个 Shape。您甚至可以在该方法中设置宽度属性,这是一个奇迹。

话虽如此,如何以一种不让子类负责复制其超类的变量的方式为子类实现 NSCopying?

0 投票
2 回答
4421 浏览

iphone - iPhone : (id)copyWithZone:(NSZone *)zone : 什么是“区域”?

在类中实现这种 NSCopying 方法以启用复制时,区域参数的用途是什么?如果我设置一个新对象,我不需要用 allocWithZone 分配它,因为一个 alloc 就足够了......我很困惑......

0 投票
2 回答
5681 浏览

objective-c - 将对象从一个 NSMutableArray 复制到另一个 NSMutableArray

我试图了解将对象从一个 NSMutableArray 复制到另一个。考虑以下 2 种情况: 1 - 将原件复制到克隆中,其中克隆中的更改将影响原件。2 - 将原件复制到克隆,其中关闭的更改不会影响原件。

首先,我尝试使用以下代码首先生成场景#1。据我了解,当不使用“mutablecopy”复制数组时,克隆数组只会保存指向原始字符串对象的指针。因此,如果我要将克隆的第一个元素更改为不同的对象,那么原始的第一个元素会更改太多,对吗?...但这不是我得到的结果。为什么?

事实上,当我使用 mutablecopy

我得到相同的结果。我很困惑。

数组类.h

数组类.m

...

0 投票
1 回答
1150 浏览

objective-c - 复制 UIImageView 子类

我在一个数组中有几个对象。这些对象来自一个UIImageView子类。

这些对象的类有几个@synthesized 属性。

在某些时候,我必须在数组的给定位置以不同的坐标创建对象的副本。然后我做:

当这段代码运行时,什么也没有发生。我的意思是,没有创建具有 10 像素偏移的对象,我在控制台中看到此消息:

** ... copyWithZone:]: 无法识别的选择器发送到实例 ... **

对象具有多个元素,例如文本框、标签和具有阴影、发光等的图像,并且新对象必须具有与文本颜色、阴影、发光、大小、图像等相同的值,因为原来的。

我认为协议UIImageView已经NSCopying到位。如果这是问题所在,我该如何实施?

请不要将我发送给文档,我已阅读它们,这就是我在这里问的原因。请给我一些实际的例子。

谢谢。

0 投票
3 回答
504 浏览

iphone - 使用 mutableCopy 时设备上的内存泄漏

当我遇到死胡同时,我以为我真的很接近发布我的这个新应用程序了。我的代码在模拟器(Xcode 4.0.2)中没有内存泄漏,但在我的设备上报告内存泄漏。

认为我的问题与我复制一个对象有关,因为在我的故障排除尝试中,我尝试不使用副本,然后内存泄漏就消失了(但我的功能当然也是如此!)。

我所做的是将 UIView 子类的多个实例添加到数组中。这个子类(其中 cityToAdd 是一个实例的城市)有两个 UIView 和一些我需要在稍后阶段访问的变量。

如果我这样做,我的设备上会出现内存泄漏:

但如果我这样做,我不会(但功能松散)

在子类中,我有这个来处理复制:

}

从 Instruments 我在设备上测试时得到这个:

在此处输入图像描述

当我深入到第二行时,它会显示: 在此处输入图像描述

最后是我的 initWithCityName 方法(抱歉发了这么长的帖子!!)我把它作为图片从 Instruments 中获取颜色和消息...

在此处输入图像描述

最后,UIIMage imageNamedUniversal 是一个扩展,可以在 iPad 上为我提供@2x 图像(但我尝试使用普通的 imageNamed 并获得相同的内存泄漏)。

我不知道从哪里开始!!欣赏任何想法。

谢谢

0 投票
1 回答
496 浏览

objective-c - 我应该在 copyWithZone: 中检查 nil 吗?

在 Sketch 示例中,如果返回,-[<NSCopying> copyWithZone:]则不检查in :-[<NSObject> init]nil

这意味着如果它确实返回nil(即错误),则在运行时将有一个空取消引用。

通常在-[<NSCopying> copyWithZone:]程序中不检查是否-[<NSObject> init]返回nil?我也不应该这样做吗?我虽然这样: