Swift3 Array 賦值研究

數(shù)組NSArray繼承自NSObject,屬于對象, 包含Copy的方法,然而Swift的數(shù)組是struct,沒有了Copy方法。那么把一個數(shù)組變量賦值給另一個變量之后,兩個變量的內存地址一樣嗎?

定義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 數(shù)組

//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]數(shù)組賦值給另一個變量時,內存地址發(fā)生改變,數(shù)組被重新創(chuàng)建

測試struct數(shù)組

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
結論:結構體數(shù)組賦值給另一個變量時,內存地址發(fā)生改變,數(shù)組被重新創(chuàng)建

測試對象數(shù)組

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數(shù)組的元素時,arr發(fā)生copy行為,地址發(fā)生變化
        my.objectArr.removeAll()
        print("After  arr address:", memoryAddress(my.objectArr)) // New address
        print("原數(shù)組元素個數(shù):\(my.objectArr.count),新數(shù)組 arr 的元素個數(shù):\(arr.count)")
    }
Paste_Image.png
結論:對象數(shù)組賦值給另外一個變量時,內存地址不變,只將引用賦值給另一個變量;原來的 array 改變后,內存地址改變,但不影響被賦值的變量。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容