📂
CMiOSBook
  • CMoney iOS Book
  • Coding 101
    • Value / Reference Type
    • ARC + Retain Cycle
    • 物件之間的溝通方式
  • 工具主題
    • 基本工具篇
    • Git 篇
  • 架構主題
    • MVC
  • CodingStyle主題
    • CodingStyle 規則
      • 專案(Project)
      • 命名(Naming)
      • 程式格式(Format)
      • 註解(Comment)
      • 類別與結構(Classes and Structures)
      • 修飾詞(Modifier)
      • 閉包表達式(Closures)
    • 靜態檢查器
    • 專案基本規定
  • UI主題
    • UIScrollViewDelegate & UITableViewDelegate
  • Charts主題
    • 簡介
    • Lesson1 Chart Setup
    • Lesson2 Chart Data
    • Lesson3 CombinedChartView
    • Lesson4 Renderer
  • Test主題
    • 單元測試的基本概念
    • XCTest-UnitTest
    • XCTest-UITest
  • 學習資源
    • 相關網站
    • 相關會議與社群
    • 計算機考題
Powered by GitBook
On this page
  • 三種記憶體區間
  • Swift 裡的 Value Type 與 Reference Type
  • 課後練習題(可以在playground上跑)

Was this helpful?

  1. Coding 101

Value / Reference Type

當操作任何物件時就是在操作記憶體,到底是如何運作的呢?

PreviousCMoney iOS BookNextARC + Retain Cycle

Last updated 4 years ago

Was this helpful?

三種記憶體區間

1. static memory:靜態變數(static),永遠存在的變數(ex. Swift中用特殊機制Lazy初始化)

2. stack memory:變數在方法結束會自動回收

3. heap memory:變數由使用者自己決定何時回收(ex. Swift中用ARC處理)

  • 參考連結:

Swift 裡的 Value Type 與 Reference Type

  • Value Type:Int, String, Array, Dict, Enum, Struct

    • 記錄在 stack memory

    • 因為變數在方法結束會自動回收

    • 所以賦值或是傳值都是"新的一份資料",即為 Pass By Value

  • Reference Type:Class, Closure

    • 記錄位址在stack memory,紀錄資料在heap memory

    • 因為變數在方法結束不會回收,是利用ARC回收

    • 所以賦值或是傳值都是"同一份資料",即為 Pass By Reference

  • Value Type 和 Reference Type 都只是基於操作記憶體的方式不同,而產生的簡稱

  • Value Type 和 Reference Type 萬年爭議哪個好?操作安全性?記憶體消耗?

var a = "0050"
var b = a
a = "2330"
print(b) // "0050"

// String 賦值是複製一份 String

func resetData(input: Int){
    input = "" // Error 無法編譯,input 預設是 let
}
struct Stock{
    var name: String = "0050"
}
var a = Stock()
var b = a
a.name = "2330"
print(b.name) // "0050"

// struct 賦值是複製一份 struct

func resetData(input: Stock){
    input.name = "" // Error 無法編譯,input 預設是 let
}
class Stock{
    var name: String = "0050"
}
var a = Stock()
var b = a
a.name = "2330"
print(b.name) // "2330"

// class 賦值是用同一份 class

func resetData(input: Stock){
    input.name = "Null"
}
resetData(input: a)
print(a.name)

// class 傳值是用同一份 class,可以在方法內修改

課後練習題(可以在playground上跑)

struct Car{
    var number = 0
    init(number: Int) {
        self.number = number
    }
}
var car0 = Car(number: 0)
var car1 = Car(number: 1)
var cars = [car0, car1]
var newCars = cars

cars.sort { $0.number > $1.number }
dump(cars) // [{number 1}, {number 0}]
dump(newCars) // [?, ?]

car0.number = 2
dump(cars) // [?, ?]
dump(newCars) // [?, ?]

cars[0].number = 3
dump(cars) // [?, ?]
dump(newCars) // [?, ?]
class Car{
    var number = 0
    init(number: Int) {
        self.number = number
    }
}
var car0 = Car(number: 0)
var car1 = Car(number: 1)
var cars = [car0, car1]
var newCars = cars

cars.sort { $0.number > $1.number }
dump(cars) // [{number 1}, {number 0}]
dump(newCars) // [?, ?]

car0.number = 2
dump(cars) // [?, ?]
dump(newCars) // [?, ?]

cars[0].number = 3
dump(cars) // [?, ?]
dump(newCars) // [?, ?]

參考連結:

C 語言程式記憶體配置概念
stack vs heap:執行時期儲存兩大要角
stack 與 heap 的底層概念
MEMORY IN C – THE STACK, THE HEAP, AND STATIC
Value Type vs. Reference Type
三大區塊
記憶體區塊的操作