码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Swift数组copy-on-write特性实例


    Swift中数组拷贝

    var arr_1 = [Int]()
    var arr_2 = [Int]()
    debugPrint("arr_1:\(Unmanaged.passUnretained(arr_1 as AnyObject).toOpaque()),arr_2:\(Unmanaged.passUnretained(arr_2 as AnyObject).toOpaque())")
    
    ---------
    "arr_1:0x00000001f5d8e968,arr_2:0x00000001f5d8e968"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    会发现两个空数组对象的地址竟然是同一个,一般而言,只要是new出来的对象,都应该指向不同的内存地址,swift表现得不太符合常理。
    如果针对数组进行添加元素操作:

    arr_1.append(1)
    debugPrint("arr_1:\(Unmanaged.passUnretained(arr_1 as AnyObject).toOpaque()),arr_2:\(Unmanaged.passUnretained(arr_2 as AnyObject).toOpaque())")
    
    ---------
    "arr_1:0x000000028078aaf0,arr_2:0x00000001f5d8e968"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当对数组添加元素后,内存地址发生了变化。
    尝试将数组清空,再次打印数组地址:

    arr_1.removeAll()
    debugPrint("arr_1:\(Unmanaged.passUnretained(arr_1 as AnyObject).toOpaque()),arr_2:\(Unmanaged.passUnretained(arr_2 as AnyObject).toOpaque())")
    
    --------
    "arr_1:0x00000001f5d8e968,arr_2:0x00000001f5d8e968"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    分析下来,Swift中,空数组都是指向的同一个内存地址,当对数组添加元素后,会指向实际的新的地址;当非空数组的所有元素被清空后,内存地址又会重新指向新的内存地址。
    查阅Swift官方文档,找到了针对array的copy-on-write优化说明:
    https://developer.apple.com/documentation/swift/array
    Swift的该特性,如何影响实际的开发工作呢 ?

    class IntArrayWrapper {
        let dataList: [Int]
        init(_ data: [Int]) {
            dataList = data
        }
    }
    var arr_1 = [Int]()
    let arr_2 = [Int]()
    var arrWrapper = IntArrayWrapper.init(arr_1)
    debugPrint("arr_1_size:\(arr_1.count),arrWrapper_dataList_size:\(arrWrapper.dataList.count)")
    arr_1.append(1)
    debugPrint("arr_1_size:\(arr_1.count),arrWrapper_dataList_size:\(arrWrapper.dataList.count)")
    
    ---------
    "arr_1_size:0,arrWrapper_dataList_size:0"
    "arr_1_size:1,arrWrapper_dataList_size:0"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    会发现,针对arr_1的修改,不会影响到arrWrapper中的dataList.
    原因是数组的copy-on-write优化功能 ,最初arr_1和arrWrapper.dataList指向是相同的内存地址,当执行arr_1.append(1)时,会执行一次数组内存拷贝,arr_1将指向新的内存地址,arrWrapper.dataList继续指向之前的内存地址,所以针对arr_1的改变,将不再会影响arrWrapper.dataList.

  • 相关阅读:
    java计算机毕业设计ssm美食视频教学网站element 前后端分离
    在agx xavier上运行 deepstream的样例 deepstream-test4
    什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?
    第二次面试 9.15
    从二值 Mask 获取外接矩形坐标
    Yocto Project 编译imx-第1节(下载和编译)
    java计算机毕业设计景区在线购票系统源码+mysql数据库+系统+lw文档+部署
    【Kafka专栏 14】Kafka如何维护消费状态跟踪:数据流界的“GPS”
    python笔记7(函数补充)
    JavaScript小技能:原型链的运作机制、Promise链
  • 原文地址:https://blog.csdn.net/HelloMagina/article/details/126260931
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号