2017-11-18 29 views
5

저는 초보자이고 Lazy Var vs. Let를 이해합니다. 특히 ImageViews와 함께 Lazy Var를 사용할 때 메모리 사용량이 많이 절약된다는 것을 알았습니다. 그러나 지금까지 본 튜토리얼과 가이드는 Lazy Var를 자주 사용하지 않기 때문에 나쁜 실행이고 의심 스럽다.Swift - 프로그래밍 방식으로 뷰를 만들 때 지연 Var vs. Let

나는 약간의 연구를 수행하여 Lazy가 "스레드 안전"이 아니라는 것을 알았지 만, 이것이 의미하는 바를 이해하지 못합니다. 나는 많은 찬반 양론을 보았지만, 나는 매우 제한된 지식을 가지고 있기 때문에 어떤 결론을 도출 할 수 없다.

언제 UIView를 만들 때 지연 막대 그래프 대 레터를 사용하는 것이 좋습니까?

lazy var profileImageView: UIImageView = { 

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

}() 
+0

'게으른 var'가 무엇인지에 대한 더 오래된 설명이 있습니다. 특히 그것을 사용할시기에 대한 섹션을보십시오 : http://mikebuss.com/2014/06/22/lazy-initialization-swift/ 이제 질문의 오른쪽 열에있는 세 가지 관련 링크를 살펴보십시오. * 그들은 당신의 것과 유사합니다. 나는 * 아무 것도 * 정말로 * 질문에 대답하지 않습니다 - 위의 링크처럼 - 각각을 사용할 때. 그들은 왜'게으른'이 무엇인지를 설명하고 (왜'var '을 사용해야하는지, 왜 무언가가 만들어지지 않는지에 대해) 나는 누군가가 당신에게 좋은 질문에 대한 좋은 답을 줄 수 있기를 희망하며 – dfd

답변

2

lazy var을 사용할 지 여부는 코드 및 컨텍스트에 따라 다릅니다. 그것은 나쁘지도 좋지도 않습니다. 적절한시기를 결정해야합니다.

결정하기 전에 무엇이 lazy var인지 알아야합니다.

lazy var은 무엇입니까?

지연 초기화는 가변 내용의 초기화 (구성)가 첫 번째 사용까지 지연되는 개념입니다. 이러한 변수에 대한 첫 번째 액세스는 초기화를 트리거합니다. lazy 초기화 된 변수를 사용하면 변수가 사용될 때까지 (필요한) 내용을 생성 할 수 없으므로 자원을 절약 할 수 있습니다.

지연 초기화의 기본 동작입니다. 필요가있을 때까지는 무언가를 만들지 않습니다. 그것은 또한 무언가가 lazy var이어야하는지 여부를 결정할 때 사용할 논리입니다.

항상 볼 수있는 (또는 다른 것) 뷰를 다루는 경우에는 지연 초기화를 사용하는 것이 중요하지 않습니다. 반면에 항상 필요하지 않은 인스턴스를 처리 할 때는 lazy var을 사용하는 것이 정당화됩니다.

보기가 항상 표시된보기 컨트롤러에서 볼 수있는 경우 게으름으로써 많은 것을 수행하지 않아도됩니다. 특정 상황에서만 볼 수있는 경우 (예 : 사용자가 일부 축소 패널을 펼친 경우) - 게으르 게 만드는 것이 좋습니다. 보기 컨트롤러를 더 빠르게로드하고 기본적으로 메모리를 적게 사용합니다.


스레드 안전성에 관한 한, lazy var은 Swift에서 스레드 안전하지 않습니다.

즉 두 개의 다른 스레드가 동일한 변수를 초기화하기 전에 동일한 lazy var에 액세스하려고하면 스레드 중 하나가 부분적으로 생성 된 인스턴스에 액세스 할 가능성이 있습니다.

당신은 스레드 안전에 대한 자세한 내용을 확인할 수 있습니다

Swift - is lazy var thread-safe?

Make "lazy var" threadsafe

2

또 다른 장점을 lazy var은 코드의 가독성을 개선하고 사용하는.

예에서 이미지보기와 관련된 코드는 이니셜 라이저, 설정 기능 또는 viewDidLoad으로 확산되는 대신 함께 그룹화됩니다.코드의 독자가보기의 구성을 이해하기 위해 코드의 여러 위치로 벤처 할 필요가 없기 때문에 로컬 추론이 향상됩니다. 당신의 견해에 대해 배우기 위해서, 그들은 선언에 뛰어들 필요가 있습니다.

lazy var으로 표시된 초기화 클로저는 self에 액세스 할 수 있으므로 대상 동작을 추가하거나 다른 상수 속성을 참조하는 등 클로저 내부에서 더 많은 구성을 수행 할 수 있습니다.

lazy var은 클로저로 속성 (특히보기)을 초기화하는 것이 좋으며, 스위프트 커뮤니티에서도 인기를 얻고있는 것으로 보입니다.

프로젝트에 따라 개발자 시간을 절약하는 것이 시스템 메모리를 절약하는 것보다 훨씬 더 중요 할 수 있습니다.