數(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 改變后,內存地址改變,但不影響被賦值的變量。