Computer >> Máy Tính >  >> Điện thoại thông minh >> iPhone

Câu chuyện về một bà mẹ và hai con trai:kiểu giá trị so với kiểu tham chiếu trong Swift

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

  • Loại giá trị ?? ‍♀️
  • Loại tham chiếu? ‍♂️

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

Họ cư xử giống nhau hay đối lập với nhau? ? ‍♂️

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

Cũng giống như các ngôn ngữ lập trình hướng đối tượng khác, Swift có các lớp như các khối xây dựng có thể xác định các phương thức, thuộc tính, bộ khởi tạo và có thể tuân theo các giao thức, hỗ trợ kế thừa &đa hình.?

Nhưng, đợi đã, đợi đã… ???

Swift cũng có cấu trúc và nó có thể xác định các phương thức, thuộc tính, bộ khởi tạo và có thể tuân theo các giao thức chỉ với một ngoại lệ kế thừa.?

Gì? Bây giờ tôi đang bối rối!!! ???

Bây giờ chúng ta hãy thêm gia vị cho sự nhầm lẫn của bạn:cấu trúc không chỉ là loại giá trị trong Swift. Tuples và enum cũng là các loại giá trị. Các lớp cũng không phải là lớp duy nhất được sử dụng làm kiểu tham chiếu. Các hàm và các bao đóng cũng là các kiểu tham chiếu. Nhưng như một sự giải thoát, ít nhất chúng ta cũng biết trọng tâm và chuyên môn chính của việc sử dụng các loại này.?

Vì vậy, cho đến thời điểm này, chúng ta chỉ còn lại một sự nhầm lẫn lớn với việc sử dụng cấu trúc và lớp.?

Vì vậy, hãy bắt đầu và giải tỏa những bối rối xung quanh.?‍♂️

Vị trí lưu trữ

Có ba loại bộ nhớ có sẵn:

  • Đăng ký?
  • Ngăn xếp ☄️
  • Hàng đống?

Các đối tượng có tuổi thọ ngắn hơn được lưu trữ bên trong thanh ghi hoặc ngăn xếp và những đối tượng có tuổi thọ dài hơn được lưu trữ bên trong heap.?

Một kiểu giá trị lưu trữ nội dung của nó trong bộ nhớ được cấp phát trong ngăn xếp, vì vậy chúng ta có thể nói rằng các kiểu giá trị được cấp phát trong ngăn xếp trong Swift. ?

Nhưng có một quan niệm sai lầm phổ biến về các loại giá trị, bạn đã nghe chưa ?? ‍♂️

Quan niệm sai lầm là hầu hết mọi người nghĩ rằng các loại giá trị luôn được lưu trữ trong Ngăn xếp.

❌❌ Chờ một chút - trường hợp này không phải lúc nào cũng vậy. ❌❌

Các kiểu giá trị có thể được lưu trữ bên trong ngăn xếp khi chúng là biến tạm thời hoặc biến cục bộ. Nhưng điều gì sẽ xảy ra nếu một kiểu giá trị được chứa bên trong một kiểu tham chiếu?

Trong tình huống này, nó có thể được lưu trữ bên trong bộ nhớ heap. ?

Chà… thật tuyệt !!!?

Vì vậy, các kiểu giá trị có thể được lưu trữ bên trong thanh ghi, ngăn xếp hoặc đống tùy thuộc vào tuổi thọ của chúng, cho dù chúng tồn tại trong thời gian ngắn hay dài. Nếu nó là một biến cục bộ, nó có thể sống bên trong ngăn xếp và nếu nó là một phần của lớp thì nó cũng có thể sống bên trong bộ nhớ heap.✅

Mặt khác, kiểu tham chiếu lưu trữ nội dung của nó trong bộ nhớ được cấp phát trong bộ nhớ heap và biến chỉ giữ một tham chiếu đến vị trí bộ nhớ nơi dữ liệu thực đã được lưu trữ. ??

Nó hoạt động như thế nào đối với loại tham chiếu ??

Vì vậy, đối với kiểu tham chiếu, nó là một tình huống khá phổ biến khi có thể có một số biến giữ tham chiếu đến cùng một vị trí bộ nhớ .⚔️

Khi một cá thể kiểu giá trị được gán cho một biến hoặc được truyền cho một hàm, thì cá thể đó sẽ được sao chép và gán cho biến đó. Nhưng với kiểu tham chiếu, chỉ tham chiếu được sao chép và biến mới giữ cùng một tham chiếu đến cùng một vị trí bộ nhớ. ?

Sự khác biệt về khả năng gây đột biến

Có thể có hai trạng thái cho một biến:

  • ? ‍♀ ️ Có thể nói? ‍♀
  • ? ️‍♂️ Bất biến? ️‍♂️

Nếu một cá thể kiểu giá trị được gán cho một biến không thay đổi, thì cá thể đó cũng trở thành bất biến. Do đó, chúng tôi không thể thực hiện bất kỳ thay đổi nào đối với phiên bản đó.?‍♂️

Nếu một cá thể kiểu giá trị được gán cho một biến có thể thay đổi, thì chỉ nó mới làm cho cá thể đó có thể thay đổi được. ? ‍♂️

Nhưng mọi thứ hoàn toàn khác đối với các loại tham chiếu. Biến và thể hiện mà nó được gán là hoàn toàn khác nhau. Nếu chúng ta khai báo một biến không thay đổi giữ một tham chiếu đến một lớp, điều này có nghĩa là tham chiếu mà nó đang giữ sẽ không bao giờ thay đổi. Chúng tôi không thể thay đổi tham chiếu và nó sẽ luôn trỏ đến cùng một tham chiếu. ?

Loại cấu trúc

Giá trị của các kiểu cấu trúc được so sánh để có sự bình đẳng về các thuộc tính hoặc yếu tố của chúng. Chúng ta có thể nói một kiểu giá trị bằng với kiểu khác nếu và chỉ khi tất cả các thuộc tính tương ứng đều bằng nhau. ???

Ừm… quá nhiều từ ngữ mạnh mẽ… ý bạn là gì ???

Giả sử, chúng tôi có Người loại giá trị có các thuộc tính như firstName lastName.

struct Person {
   var firstName: String
   var lastName: String
}

var person1 = Person(firstName: "foo", lastName: "bar")

var person2 = Person(firstName: "foo", lastName: "bar")

Ở đây cả person1 & person2 các phiên bản đang giữ cùng một giá trị cho firstName (“Foo”) lastName (“bar”) . Vì vậy, theo hiểu biết của chúng tôi, chúng tôi có thể nói rằng hai trường hợp bằng nhau vì thuộc tính của chúng ( firstName & lastName ) đang giữ các giá trị giống nhau.

Nhưng nó không chỉ giới hạn ở điều này:trong tương lai, bất kỳ trường hợp hai người nào có cùng giá trị cho firstName & lastName sẽ bình đẳng với nhau.

Vì vậy, theo hiểu biết của chúng tôi cho đến thời điểm này, chúng tôi có thể nói rằng:

Loại Giá trị không có danh tính, vì vậy không thể có tham chiếu đến chúng. Các loại giá trị là vô danh.?

Gì? Làm thế nào bạn có thể nói điều đó ????

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

Cả myAge & friendAge là biến kiểu số nguyên có giá trị 21.

Chúng ta có thể phân biệt cái này với cái kia không? ?

Không, vì chúng có cùng giá trị.?

Một biến số nguyên có giá trị 21 không thể khác với một biến số nguyên khác cũng có giá trị 21. Đơn giản như vậy. ???

Không có danh tính mang lại cho các loại giá trị một lợi thế khác:nếu bạn suy nghĩ thực tế, thì bạn có thể tưởng tượng nếu bạn không có danh tính thì bất kỳ ai có cùng đặc điểm đều có thể thay thế hoặc thay thế bạn. ???

Chúng ta cũng có thể nghĩ cho chúng ta như con người. Nếu tôi không có danh tính thì bất cứ ai có cùng đặc điểm có thể thay thế tôi ???. Thật tốt cho chúng tôi là chúng tôi có một danh tính nếu không sẽ là một rủi ro lớn cho sự tồn tại của chúng tôi.?

Nhưng đối với các loại giá trị, chúng không có danh tính và đó là một lợi thế đối với chúng. ?

Lợi ích của việc sử dụng Loại giá trị là gì?

? Không có Điều kiện Cuộc đua và Thời hạn:?

Đối với các kiểu giá trị trong môi trường đa luồng, một luồng không thể thay đổi trạng thái của cá thể trong khi nó đang được sử dụng bởi một luồng khác. Vì vậy, chúng tôi có thể nói rằng sẽ không có điều kiện đua hoặc bế tắc.

⚔️ Không giữ lại Chu kỳ:⚔️

Khi có hai cá thể kiểu tham chiếu đang giữ các tham chiếu mạnh với nhau và ngăn nhau không được phân bổ từ bộ nhớ, nó được gọi là chu kỳ lưu giữ. Vì các loại giá trị không hoạt động như một tham chiếu, vì vậy chúng tôi có thể nói rằng sẽ không có chu kỳ lưu giữ cho các loại giá trị.

? ‍? ‍? ‍? Đếm tham chiếu tự động:?‍?‍?‍?

Đối với loại tham chiếu, Swift sử dụng tính năng đếm tham chiếu tự động để theo dõi tất cả các đối tượng đang hoạt động hoặc đang hoạt động và chỉ phân bổ cá thể khi không còn tham chiếu mạnh nào đến nó. Nếu chúng ta suy nghĩ một chút, thì chúng ta có thể nói rằng đó là một thao tác nặng vì thời gian chạy Swift cần theo dõi các đối tượng luôn luôn. Nhưng vì các loại giá trị được phân bổ trong ngăn xếp, nó không cần ARC. Vì vậy, nó là rẻ hơn và nhanh hơn ??.

Nhưng chờ đã ... Nó quản lý bộ nhớ cho Mảng, Từ điển và Chuỗi như thế nào ??

Vì chúng ta không thể biết kích thước thực của một mảng, một từ điển và một chuỗi tại thời điểm biên dịch là bao nhiêu, nên không có phạm vi nào để chúng được phân bổ tại thời điểm biên dịch. Mặc dù chúng là các loại giá trị bên trong, chúng không thể được cấp phát trong ngăn xếp. Chúng cần được cấp phát trong bộ nhớ heap và để quản lý điều này, Swift đưa ra sao chép khi ghi .?

Nhưng đây là gì ??

Khi chúng ta nói một cá thể này là bản sao của một cá thể khác, điều này thực sự có nghĩa là chúng giống nhau, chúng chứa các giá trị giống nhau. Nhưng trong Swift, đối với các kiểu trên (Mảng, Từ điển, Chuỗi, v.v.), một bản sao thực sự chỉ được tạo trên heap khi một cá thể bị đột biến. Đây được gọi là kỹ thuật tối ưu hóa hiệu suất cho các loại giá trị. ???

Kết luận

Không có quy tắc cứng xác định khi nào sử dụng loại giá trị và khi nào sử dụng loại tham chiếu. Các kiểu giá trị có một số lợi thế riêng so với các kiểu tham chiếu và ngược lại. Cả hai đều độc đáo theo cách riêng của họ. Nó thực sự phụ thuộc vào yêu cầu của bạn và những gì bạn đang cố gắng đạt được. Bạn nên biết ngữ nghĩa của mã của mình vì bạn chỉ biết mã của mình là tốt nhất, vì vậy tùy bạn chọn. Bạn có toàn quyền tự do.

Vì vậy, thay vì tranh giành loại giá trị và loại tham chiếu, hãy sử dụng chúng một cách thông minh.

Đ ??? Chúc mừng !!! Cảm ơn bạn đã đọc!! ???

✅✅✅Bạn có thể tìm thấy tôi trên Twitter .✅✅✅