当我在 iOS (swift/objective c) 中使用复制命令复制对象时,是浅拷贝还是深拷贝?
var str = "Hello, playground"
var copyStr = str.copy()
和
var originalArray = [1, 2, 3, 4] as NSArray
var copyArray = originalArray.copy()
withUnsafePointer(to: &originalArray) {
print(" originall address: \($0)")
}
withUnsafePointer(to: ©Array) {
print(" copy address: \($0)")
}
帮我看看上面几行,这是深拷贝还是浅拷贝?
The issue is , this behaviour in objective c is showing me the same address with both string and array which is shallow copy and in swift3 it is showing me different address which is deep copy
最佳答案
copy 执行浅拷贝(集合的副本,但不复制数组中的对象)。例如
let obj1 = Object(value: 1)
let obj2 = Object(value: 2)
let obj3 = Object(value: 3)
let originalArray = [obj1, obj2, obj3] as NSArray
let copyArray = originalArray.copy() as! NSArray
print(String(format: "original address: %p", originalArray))
for obj in originalArray {
print(String(format: " %p", obj as! Object))
}
print(String(format: "copy address: %p", copyArray))
for obj in copyArray {
print(String(format: " %p", obj as! Object))
}
请注意,我使用了 NSNumber 和 NSString 以外的对象,因为它们的优化可能会使查看地址产生误导。
这两个数组的成员对象指向相同的对象(即浅拷贝)。
original address: 0x618000044920
0x6180000277e0
0x618000027f00
0x618000027ea0
copy address: 0x618000044920
0x6180000277e0
0x618000027f00
0x618000027ea0
事实上,如您所见,因为它是一个不可变的 NSArray,所以它似乎优化了副本实际上返回相同数组实例的位置。如果您使用可变数组 NSMutableArray,您会看到返回了两个唯一的数组,正如您所期望的那样,但它们仍将指向相同的对象集合。
但是,如果您将 NSArray(array:copyItems:) 与 copyItems 的 true 一起使用,您将获得两个具有唯一副本的唯一数组每个成员对象的:
let copyArray = NSArray(array: originalArray as! [Any], copyItems: true)
这会产生一个深拷贝(两个唯一的数组,其中复制了各个成员对象,并且它们也具有唯一的地址):
original address: 0x618000059e60
0x618000027ae0
0x618000028340
0x618000028280
copy address: 0x61800005ba20
0x618000028800
0x618000028aa0
0x618000028400
参见 the documentation对于 init(array:copyItems:) 说:
The
copy(with:)method performs a shallow copy. If you have a collection of arbitrary depth, passingtruefor theflagparameter [ofinit(array:copyItems:)] will perform an immutable copy of the first level below the surface. If you passfalsethe mutability of the first level is unaffected. In either case, the mutability of all deeper levels is unaffected.
但就个人而言,如果编写 Swift,我通常会使用 Array 和 Dictionary 值类型,而不是旧的 NSArray 和 NSDictionary 类型。
关于swift - 复制命令 - 深拷贝还是浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145351/
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程
eruby和erb有什么区别?哪些考虑因素会促使我选择其中之一?我的应用程序正在为网络设备(路由器、负载平衡器、防火墙等)生成配置文件。我的计划是对配置文件进行模板化,在源文件中使用嵌入式ruby(通过eruby或erb)来执行诸如迭代生成路由器的所有接口(interface)配置block之类的操作(这些block都非常相似,仅在标签上有所不同和IP地址)。例如,我可能有这样一个配置模板文件:hostnamesample-routerlogging10.5.16.26当通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:hostnamesample-rout
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"