2017-11-18 15 views
5

Tôi là người mới bắt đầu và tôi có thể hiểu Lazy Var và Let. Tôi đã nhận thấy rằng nó tiết kiệm một tấn sử dụng bộ nhớ khi sử dụng Lazy Var đặc biệt là với ImageViews. Nhưng các hướng dẫn và hướng dẫn tôi đã nhìn thấy cho đến nay không sử dụng Lazy Var rất thường xuyên, vì vậy tôi cảm thấy nghi ngờ rằng đó là thực hành xấu và rằng tôi đang nhìn cái gì đó.Swift - Lazy Var vs. Hãy để khi tạo chế độ xem theo chương trình (tiết kiệm bộ nhớ)

Tôi đã nghiên cứu một chút và biết rằng Lười biếng không phải là "chủ đề an toàn", nhưng tôi không hiểu ý nghĩa của điều này. Tôi đã thấy rất nhiều ưu và khuyết điểm, nhưng tôi không thể rút ra bất kỳ kết luận nào đặc biệt bởi vì tôi có kiến ​​thức rất hạn chế.

Khi nào thì ok (hoặc tốt hơn) để sử dụng Lazy Var và Let khi tạo UIView?

lazy var profileImageView: UIImageView = { 

    let imageView = UIImageView(image: #imageLiteral(resourceName: "page1")) 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    imageView.contentMode = .scaleAspectFit 
    return imageView 

}() 
+0

Đây là lời giải thích cũ hơn (có vẻ là Swift 1) về 'var var' là gì. Cụ thể xem xét phần về thời điểm sử dụng: http://mikebuss.com/2014/06/22/lazy-initialization-swift/ Bây giờ, hãy xem qua ba liên kết có liên quan ở cột bên phải của câu hỏi mà * đề xuất * chúng tương tự như của bạn tôi thấy rằng không có * thực sự * trả lời câu hỏi - như liên kết ở trên - trên * khi nào sử dụng mỗi câu hỏi. Họ giải thích 'lười biếng' là gì (và tại sao bạn phải sử dụng 'var' hoặc tại sao thứ gì đó không xây dựng. Tôi đang bỏ phiếu vì hy vọng rằng ai đó ở đây có thể cung cấp cho bạn câu trả lời hay cho câu hỏi hay – dfd

Trả lời

2

Cho dù bạn sẽ sử dụng lazy var hay không phụ thuộc vào mã và ngữ cảnh của mã. Nó không phải là xấu hay tốt một mình. Bạn phải quyết định khi nào là thích hợp.

Trước khi bạn có thể quyết định điều đó, bạn phải biết những gì lazy var là.

lazy var là gì?

Khởi tạo lười biếng là một khái niệm nơi khởi tạo (xây dựng) nội dung biến bị trì hoãn cho đến lần sử dụng đầu tiên. Truy cập đầu tiên vào việc khởi tạo biến kích hoạt như vậy. Vì nội dung không được tạo cho đến khi biến được sử dụng (cần thiết) bằng cách sử dụng các biến khởi tạo lười biếng có thể tiết kiệm tài nguyên.

Đó là ổ đĩa chính đằng sau khởi tạo lười biếng. Bạn không tạo ra một cái gì đó cho đến khi bạn cần nó. Đó cũng là logic bạn sẽ sử dụng khi quyết định xem có nên là lazy var hay không.

Nếu bạn đang xử lý các chế độ xem (hoặc bất kỳ thứ gì khác) luôn hiển thị (cần thiết), có ít điểm khi sử dụng khởi tạo lười. Mặt khác, khi bạn đang xử lý các trường hợp không phải lúc nào cũng cần - sau đó sử dụng lazy var là hợp lý.

Nếu chế độ xem của bạn luôn hiển thị trong bộ điều khiển chế độ xem được trình bày, bạn sẽ không đạt được nhiều thứ bằng cách làm cho nó trở nên lười biếng. Nếu nó chỉ hiển thị trong các trường hợp cụ thể - ví dụ khi người dùng mở rộng một số bảng điều khiển thu gọn - thì làm cho bảng điều khiển trở nên lười biếng. Nó sẽ làm cho bộ điều khiển xem của bạn tải nhanh hơn và sử dụng ít bộ nhớ hơn theo mặc định.


Theo như chủ đề an toàn là có liên quan, lazy var không phải là thread an toàn trong Swift.

Điều đó có nghĩa là nếu hai chủ đề khác nhau cố gắng truy cập cùng một lazy var cùng một lúc, trước khi biến đó được khởi tạo, có thể một trong các chủ đề sẽ truy cập một phần được tạo.

Bạn có thể tìm hiểu thêm về chủ đề an toàn trong:

Swift - is lazy var thread-safe?

Make "lazy var" threadsafe

2

lợi thế khác để sử dụng một lazy var đang được cải thiện khả năng đọc mã của bạn.

Trong ví dụ của bạn, mã liên quan đến chế độ xem hình ảnh được nhóm lại với nhau thay vì được trải ra thành bộ khởi tạo, chức năng thiết lập hoặc viewDidLoad.Điều này cải thiện lý do địa phương bằng cách không yêu cầu người đọc mã để mạo hiểm đến những nơi khác nhau trong mã để hiểu cách chế độ xem của bạn được định cấu hình. Để tìm hiểu về chế độ xem của bạn, họ chỉ cần chuyển đến tuyên bố của nó.

Đóng cửa khởi tạo được đánh dấu là lazy var có thể truy cập self, cho phép thực hiện thêm cấu hình bên trong đóng, chẳng hạn như thêm hành động đích hoặc tham chiếu các thuộc tính không đổi khác.

Tôi sẽ xem xét việc khởi tạo thuộc tính (đặc biệt là chế độ xem) với các bao đóng là lazy var 's là một thực hành tốt và dường như cũng đang trở nên phổ biến trong cộng đồng Swift.

Tùy thuộc vào dự án, việc tiết kiệm thời gian của nhà phát triển có thể có giá trị hơn nhiều so với việc tiết kiệm bộ nhớ hệ thống.

Các vấn đề liên quan