美文网首页
Swift3 Array 赋值研究

Swift3 Array 赋值研究

作者: ryanzl | 来源:发表于2017-04-03 18:08 被阅读0次

数组NSArray继承自NSObject,属于对象, 包含Copy的方法,然而Swift的数组是struct,没有了Copy方法。那么把一个数组变量赋值给另一个变量之后,两个变量的内存地址一样吗?

定义class和struct

class MyClass {
    
    var intArr = [Int]()
    var structArr =  [MyStructElement]()
    var objectArr = [MyClassElement]()
    
}
struct MyStructElement {
    
}
class MyClassElement{
    var name: String?
    init() {
        
    }
    init(name: String) {
        self.name = name
    }
}
//获取内存地址
let memoryAddress : (Any) -> String = {
    guard let cVarArg = $0 as? CVarArg else { return "Can not find memory address" }
    return String(format: "%p", cVarArg)
}

测试Int 数组

//array 的元素是 Int、struct 等,在赋值时就 copy
    func testIntArr() {
        print(#function)
        
        let my = MyClass()
        for i in 0...10000 {
            my.intArr.append(i)
        }
        print("Before arr address:",memoryAddress(my.intArr))
        

        let arr = my.intArr// If move this into async closure, crash
        print("temp arr address: ",memoryAddress(arr)) // Copy. Address different from my.intArr
        my.intArr.removeAll()

        print("After  arr address:", memoryAddress(my.intArr)) // New address
    }
QQ20170403-175746@2x.png
结论:[Int]数组赋值给另一个变量时,内存地址发生改变,数组被重新创建

测试struct数组

private func testStructArr() {
        print(#function)
        
        let my = MyClass()
        for _ in 0...10000 {
            my.structArr.append(MyStructElement())
        }
        print("Before arr address:\(memoryAddress(my.structArr))")
        let arr = my.structArr 
        print("Temp   arr address:", memoryAddress(arr)) // Copy. Address different from my.structArr
        my.structArr.removeAll()
        print("After  arr address:", memoryAddress(my.structArr)) // New address
    }
Paste_Image.png
结论:结构体数组赋值给另一个变量时,内存地址发生改变,数组被重新创建

测试对象数组

private func testObjectArr() {
        print(#function)
        
        let my = MyClass()
        for _ in 0...10000 {
            my.objectArr.append(MyClassElement())
        }
        print("Before arr address:", memoryAddress(my.objectArr))
        
        var arr = my.objectArr 
        print("Temp   arr address:", memoryAddress(arr)) // Not copy. Same as my.objectArr
        //更新arr数组的元素时,arr发生copy行为,地址发生变化
        my.objectArr.removeAll()
        print("After  arr address:", memoryAddress(my.objectArr)) // New address
        print("原数组元素个数:\(my.objectArr.count),新数组 arr 的元素个数:\(arr.count)")
    }
Paste_Image.png
结论:对象数组赋值给另外一个变量时,内存地址不变,只将引用赋值给另一个变量;原来的 array 改变后,内存地址改变,但不影响被赋值的变量。

相关文章

  • Swift3 Array 赋值研究

    数组NSArray继承自NSObject,属于对象, 包含Copy的方法,然而Swift的数组是struct,没有...

  • 数组基本操作

    Array 定义空Array Array赋值 元素判断与获取 遍历Array for in 与 forEach的区...

  • 用 Kotlin 写 Android 14—集合的约定

    集合的操作主要有访问,赋值,遍历,用符号的表示分别是 访问array[index] 赋值array[index] ...

  • 9. 解构赋值

    解构赋值 Array|Object 学习视频记录

  • JS中Array和String方法整理

    Array 1.数组定义 2.数组直接赋值 3.数组赋值覆盖元素 4.添加元素 array.push(argume...

  • JS基础4

    Array() 以上代码告诉我们,直接使用数组定义赋值是更好的方法,而不是用Array(),使用定义赋值的会在该空...

  • shell中定义和使用数组

    声明 直接声明法 declare -a zxy-array 直接赋值 zxy-array[0]= zerozxy-...

  • Array slice

    [TOC] Array Array赋值:会复制所有元素 函数传递:会复制所有元素,如果要修改Array的值,传递指...

  • numpy必知必会-第二天

    6 替换array中的元素,并赋值给新的array例如:输入arr = np.array([0, 1, 2, 3,...

  • 关于Swift集合类型的赋值和拷贝行为

    前言: 在Swift3中, 这些又发生了改变. “Swift 中,许多基本类型,诸如String,Array和Di...

网友评论

      本文标题:Swift3 Array 赋值研究

      本文链接:https://www.haomeiwen.com/subject/diroottx.html