问题标签 [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.
objective-c - NSCopyObject 被认为是有害的?
在 Xcode 文档中NSCopyObject
,特殊注意事项部分指出:
这个功能很危险,而且很难正确使用。它被任何可以子类化的类作为一部分使用
copyWithZone:
,非常容易出错。在 GC 下或使用 Objective-C 2.0 时,该区域被完全忽略。Mac OS X 10.6 之后可能会弃用此功能。
为什么很难正确使用?它执行浅(逐位)复制。对象不会被复制或保留。文档对此非常清楚。
如果我没有错过其他原因,那么执行对象浅拷贝的首选方法是什么?
编辑:
执行浅拷贝是有正当理由的。一个例子:一个类可能有许多实例变量,其中大多数是原始类型(整数、浮点数)或故意不保留以避免保留循环的对象(委托)。NSCopyObject
使用在一个漂亮的、自我记录的代码行中复制所有这些的浅拷贝。任何需要引用计数的剩余 ivars 都可以单独保留或复制。
对此的替代方法是使用指针语法 ( newObject->ivar = ivar
) 分配给新对象,或者创建一个具有可能大量参数的 init 方法(每个 ivar 复制一个)。后者让我觉得特别难看,但我认为它不需要出现在标题中并暴露给世界。
iphone - 复制 NSMutableArray 项
我正在复制一个像这样的可变数组:
数组中的项目像这样实现 copyWithZone:
但是, playerList 似乎只有“超出范围”的对象。我究竟做错了什么?
iphone - 实施 NSCopying
我已经阅读了NSCopying
文档,但我仍然不确定如何实现所需的内容。
我的班级Vendor
:
该类Vendor
有一个名为 的对象数组Car
。
我的Car
对象:
所以,Vendor
持有一个对象数组Car
。Car
包含 2 个其他自定义对象的数组。
两者都是从字典中初始化的Vendor
。Car
我将添加其中一种方法,它们可能相关也可能不相关。
所以总结一下这个可怕的问题。
我需要复制一组Vendor
对象。我相信我需要在 上实现NSCopying
协议Vendor
,这可能意味着我也需要在上实现它,Car
因为它Vendor
拥有一个 s 数组Car
。这意味着我还需要在属于该Car
对象的 2 个数组中保存的类上实现它。
如果我能得到一些关于在 上实现NSCopying
协议的指导,我将非常感激Vendor
,我在任何地方都找不到任何教程。
objective-c - 递归创建对象并从所述对象的数组中复制特定对象
所以,我在我的编程项目上有点挣扎。
我有一个存储玩家信息、姓名、胜利、失败的对象。
我继续在另一个对象(括号)中使用该对象,该对象设置播放器信息的值,在每个循环之后,它将播放器对象复制到括号类中的 NSMutable。
在括号类中,我有一个打印信息的方法,这很容易弄清楚。
现在,为了生成下一个括号会发生什么,我设置了一个方法,当它完成复制谁输赢时将返回一个括号。
我已经在同一个括号方法中完成了所有这些操作,因此我可以尽可能轻松地访问数据。我如何简单地复制播放器对象并将其添加到新括号中?
当我尝试打印刚刚生成的括号时,我发现我只是得到垃圾值或什么都没有。这是我遇到问题的功能。
所以,我认为这会奏效。它编译得很好(我收到了一些警告,但它是关于整数的,所以我主要用于逻辑)。
谢谢你!
objective-c - 在子类的子类中实现 NSCopying
我有一个小的类层次结构,我无法实现copyWithZone:
。我已阅读 NSCopying 文档,但找不到正确答案。
参加两个课程:Shape和Square。正方形定义为:
那里并不奇怪。每个类都有一个属性,Shape 有一个“sides”int,Square 有一个“width”int。copyWithZone:
方法见下:
形状
正方形
查看文档,这似乎是做事的“正确”方式。
它不是。
如果您尝试设置/访问该copyWithZone:
方法返回的 Square 的 width 属性,它将失败并出现类似于以下错误的错误:
调用[super copyWithZone:zone];
Square 方法实际上返回一个 Shape。您甚至可以在该方法中设置宽度属性,这是一个奇迹。
话虽如此,如何以一种不让子类负责复制其超类的变量的方式为子类实现 NSCopying?
iphone - iPhone : (id)copyWithZone:(NSZone *)zone : 什么是“区域”?
在类中实现这种 NSCopying 方法以启用复制时,区域参数的用途是什么?如果我设置一个新对象,我不需要用 allocWithZone 分配它,因为一个 alloc 就足够了......我很困惑......
objective-c - 将对象从一个 NSMutableArray 复制到另一个 NSMutableArray
我试图了解将对象从一个 NSMutableArray 复制到另一个。考虑以下 2 种情况: 1 - 将原件复制到克隆中,其中克隆中的更改将影响原件。2 - 将原件复制到克隆,其中关闭的更改不会影响原件。
首先,我尝试使用以下代码首先生成场景#1。据我了解,当不使用“mutablecopy”复制数组时,克隆数组只会保存指向原始字符串对象的指针。因此,如果我要将克隆的第一个元素更改为不同的对象,那么原始的第一个元素会更改太多,对吗?...但这不是我得到的结果。为什么?
事实上,当我使用 mutablecopy
我得到相同的结果。我很困惑。
数组类.h
数组类.m
...
objective-c - 复制 UIImageView 子类
我在一个数组中有几个对象。这些对象来自一个UIImageView
子类。
这些对象的类有几个@synthesize
d 属性。
在某些时候,我必须在数组的给定位置以不同的坐标创建对象的副本。然后我做:
当这段代码运行时,什么也没有发生。我的意思是,没有创建具有 10 像素偏移的对象,我在控制台中看到此消息:
** ... copyWithZone:]: 无法识别的选择器发送到实例 ... **
对象具有多个元素,例如文本框、标签和具有阴影、发光等的图像,并且新对象必须具有与文本颜色、阴影、发光、大小、图像等相同的值,因为原来的。
我认为协议UIImageView
已经NSCopying
到位。如果这是问题所在,我该如何实施?
请不要将我发送给文档,我已阅读它们,这就是我在这里问的原因。请给我一些实际的例子。
谢谢。
iphone - 使用 mutableCopy 时设备上的内存泄漏
当我遇到死胡同时,我以为我真的很接近发布我的这个新应用程序了。我的代码在模拟器(Xcode 4.0.2)中没有内存泄漏,但在我的设备上报告内存泄漏。
我认为我的问题与我复制一个对象有关,因为在我的故障排除尝试中,我尝试不使用副本,然后内存泄漏就消失了(但我的功能当然也是如此!)。
我所做的是将 UIView 子类的多个实例添加到数组中。这个子类(其中 cityToAdd 是一个实例的城市)有两个 UIView 和一些我需要在稍后阶段访问的变量。
如果我这样做,我的设备上会出现内存泄漏:
但如果我这样做,我不会(但功能松散)
在子类中,我有这个来处理复制:
}
从 Instruments 我在设备上测试时得到这个:
当我深入到第二行时,它会显示:
最后是我的 initWithCityName 方法(抱歉发了这么长的帖子!!)我把它作为图片从 Instruments 中获取颜色和消息...
最后,UIIMage imageNamedUniversal 是一个扩展,可以在 iPad 上为我提供@2x 图像(但我尝试使用普通的 imageNamed 并获得相同的内存泄漏)。
我不知道从哪里开始!!欣赏任何想法。
谢谢
objective-c - 我应该在 copyWithZone: 中检查 nil 吗?
在 Sketch 示例中,如果返回,-[<NSCopying> copyWithZone:]
则不检查in :-[<NSObject> init]
nil
这意味着如果它确实返回nil
(即错误),则在运行时将有一个空取消引用。
通常在-[<NSCopying> copyWithZone:]
程序中不检查是否-[<NSObject> init]
返回nil
?我也不应该这样做吗?我虽然这样: