• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    해결됨

9번 프로젝트 질문

21.08.23 14:37 작성 조회수 174

1

예제 함께하기 - 친구목록 테이블뷰 코드작성

// MARK: - Button States

extension FriendViewController {

    private func correctBarButtonState() {

        

        self.navigationItem.rightBarButtonItems = nil

        

        let rightBarButtonItem: UIBarButtonItem

        

        if Person.bestFriends.contains(self.friend) {

            rightBarButtonItem = self.fullStarButton

        } else {

            rightBarButtonItem = self.emptyStarButton

        }

        

        self.navigationItem.rightBarButtonItems = [rightBarButtonItem]

    }

}

셀을 클릭하여 친구정보를 확인하고나서, 별 버튼을 눌렀을 때 오류가 발생합니다.

오류 위치는 rightBarButtonItem = self.fullStarButton 입니다. self.fullStarButton 이 nil 이더라구요.

    // MARK: Stored Properties

    var friend: Person! {

        didSet {

            self.navigationItem.title = friend.name.first.uppercased()

            self.correctBarButtonState()

        }

    }

위 코드에 의해서 self.correctBarButtonState() 가 호출될때는 self.fullStarButton 이 nil 이 아닌데, 왜 별 버튼 클릭 시 호출될때는 nil 로 바뀌었는지 이해야되지 않습니다.

위 코드만으로 파악해주실 수 있으실까요?

ps. viewWillAppear() 에서도 self.fullStarButton 이 nil 입니다

또 이해가 안가는건

        if Person.bestFriends.contains(self.friend) {

            rightBarButtonItem = self.fullStarButton

        } else {

            rightBarButtonItem = self.fullStarButton

        }

위처럼 둘다 self.fullStarButton 으로 설정해버리면 오류 발생없고 nil 이 아닙니다;;
이해가 어렵습니다 ㅠㅠ

답변 2

·

답변을 작성해보세요.

1

화면에 보이는 버튼은 자신의 부모뷰에 의해 강한참조를 당하니 메모리에서 해제되지 않는데, 화면에서 보이지 않는 순간 부모도 더이상 참조하지 않으니 다른 곳에서 강한참조로 엮여있지 않으면 더이상 참조되는 곳이 없으니 메모리에서 해제됩니다.

weak를 없애면 강한 참조를 하는데, 버튼이 자신의 부모뷰 뿐만 아니라 뷰 컨트롤러에게도 강한참조로 엮여 있으니 화면에서 보이지 않더라도 메모리에서 해제되지 않죠.

강한 참조와 약한 참조에 대해 아직 잘 모른다면 더 자세한 내용은 Swift의 ARC 기능에 대해 알아보는 것이 좋습니다.

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

혹,참조 타입에 대해 잘 모르고 있다면 이 아래 문서도 도움이 됩니다.

https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html

namgi kim님의 프로필

namgi kim

질문자

2021.08.25

약한 참조로 정의한 요소는 처음화면에서 보이지 않으면 곧바로 해제가 되는군요

친구들 - TableView에서의 별 버튼과는 같은 듯 확연한 차이가 있네요

어떤 요소를 숨겼다 보였다 하는 기능에서 주의해야겠네요

책 후반부까지 다 못봤더니 놓쳤네요;;

감사합니다!

1

emptyStarButton이 nil이거나 emptyStarButton에 잘못된 target이 연결된 것 같습니다.

namgi kim님의 프로필

namgi kim

질문자

2021.08.24

    @IBOutlet weak var imageView: UIImageView!

    @IBOutlet weak var nameLabel: UILabel!

    @IBOutlet weak var cellLabel: UILabel!

    @IBOutlet weak var nationaliyLabel: UILabel!

    @IBOutlet weak var fullStarButton: UIBarButtonItem!

    @IBOutlet weak var emptyStarButton: UIBarButtonItem!

제가 실습을 따라하면서 FriendViewController.swift 에서 위와같이 UIBarButtonItem 변수에 weak 키워드를 달았었습니다. (드래그 앤 드롭으로 하다보니..)

저는 이 부분을 크게 생각하지 않았는데, 저 키워드를 제거하니 오류가 해결되었습니다.

혹시 설명 부탁드려도 될까요?