SnoopClass / Discussion

0 stars 0 forks source link

lazy StackView에 UIView 선언 후 추가 시 오류 발생하고 있습니다. #1

Open GODNOEL opened 2 years ago

GODNOEL commented 2 years ago

‼️ 문제의 배경

Noel-Student-IKEA의 4번째 PR에 스누피의 코드리뷰 내용을 반영하려고 코드를 수정했습니다.

원문 : https://github.com/SnoopClass/Noel-Student-IKEA/pull/4#discussion_r986066265



image


💻 기존 코드

//stackview와 UIView가 따로 선언되어 있었음
    private lazy var stackView: UIStackView = {
        $0.axis = .vertical
        $0.distribution = .equalSpacing
        $0.spacing = 0.0
        $0.translatesAutoresizingMaskIntoConstraints = false
        return $0
    }(UIStackView())

    private let searchBarSectionView: UIView = {
        $0.backgroundColor = .red
        return $0
    }(UIView())

    private let recentProductSectionView: UIView = {
        $0.backgroundColor = .yellow
        return $0
    }(UIView())

    private let categorySectionView: UIView = {
        $0.backgroundColor = .orange
        return $0
    }(UIView())

    private let campaignSectionView: UIView = {
        $0.backgroundColor = .green
        return $0
    }(UIView())

    private let popularProductSectionVie: UIView = {
        $0.backgroundColor = .blue
        return $0
    }(UIView())

    private let loginSectionView: UIView = {
        $0.backgroundColor = .purple
        return $0
    }(UIView())

    private let informationSectionView: UIView = {
        $0.backgroundColor = .systemPink
        return $0
    }(UIView())




😱 문제 상황

그래서 stackView 안에 UIView 화면들을 선언후 추가하는 형태의 코드로 수정했습니다.

💻수정코드

class SearchViewController: UIViewController {

    // MARK: - property

  ...

    // 문제 부분
    private lazy var stackView: UIStackView = {
        let stackview = UIStackView()
        stackview.axis = .vertical
        stackview.distribution = .equalSpacing
        stackview.spacing = 0.0
        stackview.translatesAutoresizingMaskIntoConstraints = false

        let searchBarSectionView = UIView()
        searchBarSectionView.backgroundColor = .yellow

        let recentProductSectionView = UIView()
        recentProductSectionView.backgroundColor = .yellow

        let categorySectionView = UIView()
        categorySectionView.backgroundColor = .yellow

        let campaignSectionView = UIView()
        let popularProductSectionVie = UIView()
        let loginSectionView = UIView()
        let informationSectionView = UIView()

        [
            searchBarSectionView,
            recentProductSectionView,
            categorySectionView,
            campaignSectionView,
            popularProductSectionVie,
            loginSectionView,
            informationSectionView
        ].forEach {
            $0.heightAnchor.constraint(equalToConstant: 500).isActive = true
            self.stackView.addArrangedSubview($0)
        }

        return stackview
    }()

그랬더니 아래 오류 발생‼️하고 시뮬레이션에 stackView 영역도 안잡히는 현상이 발생하는데요

찾아보니 해당 오류는 메모리 문제 같은데 어디가 잘못된거고 어떻게 해결할 수 있을지 모르겠습니다. 지금 forEach 부분에서 문제가 발생하는 것 같은데 (map으로 변경해도 동일 문제 발생) 메모리에 영향을 갈만한 코드인지 잘 모르겠어서 여러분의 도움이 필요합니다..

Thread 1: EXC_BAD_ACCESS (code=2, address=0x16efc3fa0)
image


(참고) 온라인 강의에서도 저런식으로 구현한 코드가 있어서 어떤 부분에서 문제가 발생하는지.. 잘 모르겠습니다..!

image
compuTasha commented 2 years ago

코드를 실행해보고 싶은데 현재 어느 브랜치에서 작업중이신지 알려주실 수 있나요??

compuTasha commented 2 years ago

우선 비슷한 에러인 것 같아 링크 첨부합니다...!!! https://stackoverflow.com/questions/49021054/swift-access-lazy-var-endless-loop-cause-crash?noredirect=1&lq=1

compuTasha commented 2 years ago

lazy var를 언제 사용하면 좋은지에 대한 좋은 글이 있어서 첨부합니다!! https://mikebuss.com/2014/06/22/lazy-initialization-swift/

GODNOEL commented 2 years ago

여러분 해결했습니다...^^😅

제가.. 오타를 내고 그걸 못 찾아 냈습니다... 열심히 저와 함깨 고민해주신 갓로라 @compuTasha 너무 감사하고..🙇‍♀️ 실수를 발견해주신 갓듀나 @YoonAh-dev 넘넘 감사합니다..🙇‍♀️

image

😅 해당 부분을 수정하니 StackView가 잘 나오는 모습..^^

image

💻 수정 코드

class SearchViewController: UIViewController {

    // MARK: - property

    ....

// 문제 해결!
    private var stackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .equalSpacing
        stackView.spacing = 0.0
        stackView.translatesAutoresizingMaskIntoConstraints = false

        let searchBarSectionView = UIView()
        let recentProductSectionView = UIView()
        let categorySectionView = UIView()
        let campaignSectionView = UIView()
        let popularProductSectionVie = UIView()
        let loginSectionView = UIView()
        let informationSectionView = UIView()

        searchBarSectionView.backgroundColor = .red
        recentProductSectionView.backgroundColor = .yellow
        categorySectionView.backgroundColor = .orange

        [
            searchBarSectionView,
            recentProductSectionView,
            categorySectionView,
            campaignSectionView,
            popularProductSectionVie,
            loginSectionView,
            informationSectionView
        ].forEach {
            $0.heightAnchor.constraint(equalToConstant: 500).isActive = true
            stackView.addArrangedSubview($0)
        }
        return stackView
    }()