Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> iPhone

Hiểu Swift: So Sánh Value Type Và Reference Type

Swift là một người mẹ? và có hai con trai ?-

  • Value Type ??‍♀️
  • Reference Type ?‍♂️

Nhưng đặc điểm của họ là gì??‍♂️

Họ hành xử giống hay ngược nhau? ?‍♂️

Swift là ngôn ngữ lập trình đa paradigm do Apple phát triển cho iOS, macOS, watchOS, tvOS, Linux, và z/OS.?

Giống ngôn ngữ OOP khác, Swift có class làm building block định nghĩa method, property, initializer, conform protocol, hỗ trợ inheritance & polymorphism.?

Nhưng, chờ đã…???

Swift cũng có struct và cũng định nghĩa method, property, initializer, conform protocol với chỉ một ngoại lệ: inheritance.?

Cái gì? Tôi bị confused!!! ???

Tăng thêm confusion: struct không phải value type duy nhất trong Swift. Tuple và enum cũng là value type. Class cũng không phải reference type duy nhất. Function và closure cũng là reference type. Nhưng như một sự an ủi, chúng ta ít nhất biết focus chính & chuyên môn hóa dùng các type này.?

Vậy đến đây chỉ còn một confusion lớn về dùng struct và class.?

Đi clear confusion nào.?‍♂️

Vị Trí Lưu Trữ (Storage Locations)

Có ba loại storage:

  • Register ?
  • Stack ☄️
  • Heap ?

Object tuổi thọ ngắn lưu trong register hoặc stack, tuổi thọ dài lưu trong heap.?

Value type lưu nội dung trong memory allocated trong stack, nên value type allocated trong stack trong Swift. ?

Nhưng có misconception phổ biến về value type, nghe chưa??‍♂️

Misconception: hầu hết nghĩ value type luôn lưu trong Stack.

❌❌ Đợi đã — không phải luôn vậy. ❌❌

Value type lưu trong stack khi là biến temporary hoặc local. Nhưng nếu value type chứa bên trong reference type thì sao?

Trong tình huống này, nó có thể lưu trong heap memory. ?

Wow…cool!!!?

Vậy value type có thể lưu trong register, stack, hoặc heap tùy tuổi thọ, ngắn hay dài. Nếu biến local sống trong stack, nếu là phần của class thì sống trong heap memory cũng được.✅

Ngược lại, reference type lưu nội dung trong memory allocated trong heap và biến chỉ giữ reference đến vị trí memory nơi data thực tế lưu. ??

Reference type hoạt động ra sao??

Với reference type, khá phổ biến khi có nhiều biến giữ reference đến cùng một memory location.⚔️

Khi instance value type gán cho biến hoặc pass vào hàm, instance bị copy và gán cho biến đó. Nhưng reference type, chỉ reference bị copy và biến mới giữ cùng reference đến cùng memory location. ?

Khác Biệt Về Mutability

Biến có hai trạng thái:

  • ?‍♀️ Mutable ?‍♀️
  • ?️‍♂️ Immutable ?️‍♂️

Nếu instance value type gán cho immutable variable, instance cũng thành immutable. Kết quả, không thể thay đổi instance đó.?‍♂️

Nếu instance value type gán cho mutable variable, chỉ khi đó instance thành mutable. ?‍♂️

Nhưng reference type hoàn toàn khác. Biến và instance gán cho nó hoàn toàn tách biệt. Nếu khai báo immutable variable giữ reference đến class, nghĩa là reference nó giữ sẽ không bao giờ thay đổi. Không thể đổi reference và luôn trỏ cùng reference. ?

Kiểu Cấu Trúc (Structural Types)

Giá trị structural type so sánh equality theo attribute hoặc element. Nói value type bằng nhau nếu và chỉ nếu tất cả attribute tương ứng bằng nhau. ???

Um… từ quá mạnh… ý gì???

Ví dụ, có Person value type với attribute firstName và lastName.

struct Person { var firstName: String var lastName: String } var person1 = Person(firstName: "foo", lastName: "bar") var person2 = Person(firstName: "foo", lastName: "bar")

Cả person1 & person2 giữ cùng giá trị firstName ("foo") và lastName ("bar"). Theo hiểu, hai instance bằng nhau vì attribute (firstName & lastName) giữ cùng giá trị.

Không chỉ vậy: tương lai, bất kỳ hai person instance nào giữ cùng giá trị firstName & lastName sẽ bằng nhau.

Theo hiểu đến đây, có thể nói:

Value Types không có identity, nên không có reference đến chúng. Value types là vô danh.?

Cái gì? Nói thế sao????

var myAge: Int = 21
var friendAge: Int = 21

Cả myAge & friendAge là biến integer giá trị 21.

Có phân biệt được cái nào không? ?

Không, vì giữ cùng giá trị.?

Biến integer giá trị 21 không khác biệt từ biến integer khác cũng giá trị 21. Đơn giản vậy.???

Không có identity cho value type lợi thế khác: nếu nghĩ thực tế, tưởng tượng nếu không có identity thì ai cùng đặc điểm có thể replace hoặc substitute bạn. ???

Cũng nghĩ vậy cho con người. Nếu tôi không có identity thì ai cùng đặc điểm có thể thay tôi???. May mắn chúng ta có identity nếu không rủi ro lớn cho sự tồn tại.?

Nhưng value type, không có identity và đó là lợi thế. ?

Lợi Ích Của Value Type?

? Không Race Condition Và Deadlock: ?

Với value type trong môi trường multi-threaded, impossible cho thread nào mutate state của instance بينما thread khác đang dùng. Nên không race condition hoặc deadlock.

⚔️ Không Retain Cycle: ⚔️

Khi hai instance reference type giữ strong reference lẫn nhau ngăn không cho deallocate khỏi memory, gọi là retain cycle. Vì value type không làm reference, nên không retain cycle cho value type.

?‍?‍?‍? Automatic Reference Counting: ?‍?‍?‍?

Reference type, Swift dùng automatic reference counting theo dõi object live/active và deallocate instance chỉ khi không còn strong reference. Nghĩ một chút, đây heavy operation vì Swift runtime phải track object luôn. Nhưng value type allocated trong stack, không cần ARC. Vậy rẻ và nhanh hơn??.

Nhưng đợt… Array, Dictionary, String quản lý memory thế nào??

Vì không biết size thực tế array, dictionary, string lúc compile time, không scope allocate ở compile time. Dù là value type nội bộ, không allocate được trong stack. Cần allocate heap, và quản lý này, Swift đưa ra copy on write.?

Đây là gì??

Khi nói instance này copy của instance kia, nghĩa là chúng giống nhau, chứa cùng giá trị. Nhưng Swift, cho các type trên (Array, Dictionary, String, v.v), actual copy trên heap chỉ xảy ra khi instance bị mutate. Đây gọi là performance optimization technique cho value type.???

Kết Luận

Không có hard rule định khi dùng value type khi dùng reference type. Value type có lợi thế unique so reference type và ngược lại. Cả hai unique riêng. Thực sự phụ thuộc requirement và mục tiêu bạn. Nên biết semantics của code vì bạn hiểu code mình nhất, nên do bạn chọn. Bạn có toàn quyền tự do.

Thay vì tranh value type vs reference type, hãy dùng chúng thông minh.

??? Cheers!!! Cảm ơn đã đọc!! ???

✅✅✅Tìm tôi trên Twitter.✅✅✅