인프런 커뮤니티 질문&답변
활용 앱 30강 에러 질문입니다
작성
·
10
0
let backButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle("Back", for: .normal)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = UIColor.blue
button.titleLabel?.font = .boldSystemFont(ofSize: 20)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
backButton 설정시에 addTarget 첫번째 인자로 self 로 전달하니까
'self' refers to the method 'FirstViewController.self', which may be unexpected
라는 warning 문구가 xcode 내에 표시되어서 xcode 에서 추천하는 방향대로 아래 코드블록 처럼 FirstViewController.self 로 전달하니까 backButton 클릭시 Exception 이 발생하는데요.
button.addTarget(FirstViewController.self, action: #selector(backButtonTapped), for: .touchUpInside)
이 부분 왜 Excpetion 이 발생하는건지 궁금합니다.
self 로 전달하면 문제는 없는데 경고문구가 나오는게 신경쓰입니다.
경고문구를 없애고 버튼 클릭에도 문제가 없으려면 어떻게 하는게 좋을까요?
Exception 문구는 아래와 같습니다.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NextVC.FirstViewController backButtonTapped]: unrecognized selector sent to class 0x100e4a3d8'
*** First throw call stack:
(0x19df92964 0x19ae81814 0x19e02d140 0x19df1235c 0x19df1a200 0x1a4c49f58 0x1a4501154 0x1a4501498 0x1a44fdf08 0x1a450001c 0x1a4c7a2d4 0x1a4c7b734 0x1a4c5e170 0x1a3892d38 0x1a38a1e28 0x1a3894c50 0x1a38a2ee4 0x1a38a2374 0x28cd15560 0x19dee34cc 0x19df130b0 0x19df12fd8 0x19deeac1c 0x19dee9a6c 0x23fb18498 0x1a38c2df8 0x1a386be54 0x1a3997820 0x100e365cc 0x100e3653c 0x100e36648 0x19aed6e28)
libc++abi: terminating due to uncaught exception of type NSException
답변 2
0
네 안녕하세요!
https://pointed-earwig-996.notion.site/iOS-153d2c99af2c4aa0ad40171de4ceb824
해당 내용은 자주하는 질문에서 아주 자세하게 설명드리고 있는내용이라, 자주하는 질문 중 아래 내용을 참고 부탁드립니다. :)

간단하게 말씀드리면, 엑스코드에서 추천해주는 FirstViewController.self는 잘못된 것입니다. (엑스코드 오류입니다.)
let 로 선언된 것을 lazy var로 선언하셔야하고, self(FirstViewController) 객체가 먼저 메모리에 올라가 있는 상태에서 접근해야 하기 때문에, lazy var로 선언해주는 것은 button 생성시점을, self 생성 시점 이후로 미뤄주는 것입니다.
감사합니다. :)
0
안녕하세요, 인프런 AI 인턴입니다. 이한재님.
현재 겪고 계신 문제는 addTarget 메서드를 사용하여 버튼의 액션을 설정할 때 발생하는 것입니다.
문제의 원인
addTarget메서드는 이벤트를 처리할 객체와 그 객체에 있는 메서드를 지정합니다.
self를 사용하는 경우, 현재 인스턴스를 가리키며, 이 인스턴스는 메서드를 호출할 수 있는 상태입니다.
- 반면에,
FirstViewController.self를 사용하면 클래스 타입을 가리킵니다. 클래스 타입에는 인스턴스 메서드를 직접 호출할 수 없으므로, 셀렉터가 인식되지 않아 예외가 발생합니다.
경고 해결 방법
경고를 없애고 버튼 클릭 시 문제를 해결하기 위해서는 self를 사용해야 합니다. 아래 방법으로 코드를 수정하세요:
let backButton: UIButton = {
let button = UIButton(type: .custom)
button.setTitle("Back", for: .normal)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = UIColor.blue
button.titleLabel?.font = .boldSystemFont(ofSize: 20)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
참고할 만한 관련 질문
- self와 클래스이름.self의 차이점: 인스턴스와 타입 간의 차이점에 대해 설명하는 게시물입니다. 객체 지향 프로그래밍에서 self와 클래스 타입의 차이를 이해하는 데 도움이 됩니다.
위 코드와 설명을 참고하셔서 self를 사용하는 방식으로 경고 없이 정상적으로 코드가 작동하도록 설정하시기 바랍니다. 문제가 지속될 경우 추가적인 정보나 오류 메시지를 공유해 주시면 더 도움을 드릴 수 있도록 하겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





