"[UIView setDataSource:] unrecognized selector sent to instance" 오류는 UIView 객체에서 setDataSource 메서드를 호출하려고 할 때 발생하는 오류입니다. 이 오류는 UIView 클래스에는 setDataSource 메서드가 정의되어 있지 않기 때문에 발생합니다. 보통 UITableView나 UICollectionView와 같은 특정 UI 컴포넌트에서 setDataSource를 사용하는데, UIView는 그와 같은 기능을 제공하지 않기 때문에 이런 오류가 생깁니다. 즉 UIView 클래스에는 setDataSource라는 메서드가 없는데, 해당 메서드를 호출하려고 할 때 발생하는 런타임 오류입니다.

주요 원인
- 잘못된 클래스에 메서드를 호출한 경우 : setDataSource는 보통 UITableView나 UICollectionView와 같은 데이터 소스를 필요로 하는 UI 요소에 사용되는 메서드이다. 만약 UIView 객체에 dataSource를 설정하려고 하면 이 오류가 발생한다.
let myView = UIView()
myView.dataSource = self // <- 이 부분에서 오류 발생 가능성이 높다.
myView는 UITableView나 UICollectionView의 인스턴스가 아니므로 dataSource 속성을 가지고 있지 않다. 이 경우 dataSource를 설정하려는 객체가 올바른 타입인지 확인해야 한다.
- 객체 타입이 잘못 캐스팅된 경우 : Interface Builder(Storyboards 또는 XIB)에서 뷰를 UIView로 잘못 연결했을 때도 이 오류가 발생할 수 있다. 예를 들어, Storyboard에 UITableView를 추가했는데, 해당 뷰를 참조하는 IBOutlet 변수의 타입이 UIView로 지정되어 있는 경우 오류가 발생할 수 있다.
@IBOutlet weak var myTable: UIView! // <- myTable은 UITableView라면 오류 발생
이후 코드에서 myTable.dataSource = self와 같이 호출하면, 컴파일러는 myTable을 UIView로 인식하기 때문에 이 오류가 발생한다. 이 경우 Storyboard에서 해당 IBOutlet의 타입을 UITableView로 올바르게 변경해야 한다.
- 연결된 IBOutlet이나 IBAction : 스토리보드에서 IBOutlet이나 IBAction 연결이 올바르게 되어 있지 않거나, 코드에서 해당 메서드가 정의되어 있지 않을 때 오류가 발생한다.
해결 방법
- 클래스 확인 : setDataSource 메서드를 호출하려는 객체가 UIView인지, 아니면 UITableView 또는 UICollectionView와 같은 데이터 소스를 설정할 수 있는 클래스인지 확인한다. UITableView나 UICollectionView에서 데이터를 처리하려면 해당 클래스에서 setDataSource를 호출해야 한다.
- 타입 확인 : setDataSource를 호출한 객체의 타입이 올바른지 확인한다. 예를 들어 UIView 대신 UITableView 또는 UICollectionView 인스턴스를 사용해야 한다.
- 메서드 호출 확인 : setDataSource 메서드를 호출하는 코드에서 타입을 올바르게 캐스팅했는지 확인한다. 예를 들어, UIView를 UITableView로 캐스팅한 후 setDataSource를 호출할 수 있다.
- Interface Builder(Storyboard/XIB)를 사용하는 경우, IBOutlet의 연결된 객체와 변수의 타입이 일치하는지 확인한다.
추가적인 해결 방법
- UIView에 대해 setDataSource를 호출하고자 한다면, 이를 UITableView나 UICollectionView와 같은 적절한 클래스에서 호출할 수 있도록 코드를 수정해야 한다.
- UITableView나 UICollectionView에서 dataSource를 설정할 때 self가 데이터 소스 프로토콜을 준수하고 있는지 확인해 본다.

이번 오류의 경우, UIView 객체에 dataSource를 설정하려고 할 때 이 오류가 발생했다. 클래스, 타입, 메서드 호출 확인 등 코드를 살펴보고 setDataSource를 호출하는 객체가 올바른 타입인지 확인해 보았다. 해당 오류가 해결되지 않아 결국 해당 객체를 새로 연결해 주면서 해결.
결국 이번 오류인 [UIView setDataSource:] unrecognized selector sent to instance 오류도 에러 메시지를 주의 깊게 읽고,
setDataSource를 호출하는 객체가 UIView가 아닌 UITableView나 UICollectionView 등의 올바른 타입인지 확인하고, Interface Builder의 연결 상태와 코드의 객체 타입을 꼼꼼히 확인하는 것이 중요하다는 것을 느꼈다.
unrecognized selector sent to instance 오류에 대해서도 따로 정리
"unrecognized selector sent to instance" 오류는 주로 iOS 개발(Objective-C 또는 Swift)에서 흔히 발생하는 런타임 오류입니다. 이 오류는 객체(인스턴스)가 해당 메서드를 인식하지 못할 때 발생합니다. 즉, 존재하지 않는 메서드를 호출하려고 할 때 발생합니다.
주요 원인
- 오타 또는 잘못된 메서드 이름 : 메서드를 호출할 때 메서드 이름이 잘못되었거나, 호출하려는 객체에 해당 메서드가 없을 때, 매개 변수 타입이 맞지 않는 경우 오류가 날 수 있다.
- 타입 캐스팅 오류 : 객체가 예상되는 타입이 아니라 다른 타입이 할당되어 있을 때 오류가 발생한다.
- 메서드 삭제나 변경 : 메서드가 삭제되었거나 변경되었지만, 여전히 호출되고 있는 경우에 발생한다.
- 연결(Outlet) 문제 : 스토리보드에서IBOutlet이나IBAction연결이올바르게되어있지않거나,코드에서해당메서드가정의되어있지않을때 오류가 발생한다. 스토리보드(Storyboard)나 XIB에서 UI 객체에 연결된 @IBAction이 삭제되었거나 이름이 변경되었을 때 이 오류가 발생할 수 있다. UI 객체(버튼, 테이블 뷰 등)를 control 키를 누른 채 드래그하여 코드의 @IBAction에 연결하는데, 연결된 액션이 코드에서 사라지면 오류가 발생한다.
- 잘못된 객체 타입 : 객체를 선언할 때 지정된 타입과 실제로 할당된 객체의 타입이 다를 때 발생한다. 예를 들어, UIButton 타입의 변수에 UILabel 객체를 할당하고 UIButton의 메서드를 호출하려고 하면 오류가 발생한다.
- 델리게이트(Delegate) 또는 데이터 소스(DataSource) 연결 누락 : UITableView나 UICollectionView와 같은 일부 UI 컴포넌트는 delegate나 dataSource를 연결해야 정상적으로 동작한다. 이 연결이 누락되면 컴포넌트가 델리게이트 메서드를 호출할 때 오류가 발생할 수 있다.
해결 방법
- 메서드 이름 확인 : 호출하려는 메서드의 이름이 정확한지, 그리고 올바른 인스턴스에서 호출되었는지 확인한다.
- 객체의 타입 확인 : 해당 객체가 올바른 클래스의 인스턴스인지 확인해 본다.
- 디버깅 : breakpoint를 설정하고 디버거를 사용해서 어떤 객체가 오류를 발생하는지 확인하고, 호출되는 메서드가 정확히 무엇인지 점검한다.
- 에러 메시지 확인 : 오류 메시지는 어떤 클래스의 어떤 인스턴스가 어떤 셀렉터(메서드)를 인식하지 못했는지 알려준다. 예를 들어 -[UIButton setImage:]: unrecognized selector sent to instance와 같은 메시지는 UIButton 인스턴스에 setImage: 메서드를 호출하려 했음을 알려주는데 이 정보를 바탕으로 어느 객체와 메서드에서 문제가 발생했는지 파악할 수 있다.
- Interface Builder (Storyboard/XIB) 연결 확인 : 해당 오류가 UI 상호작용(버튼 탭 등)과 관련되어 있다면, Storyboard나 XIB 파일을 열고, 문제가 되는 UI 요소(예: 버튼)를 선택하고 Connections Inspector (오른쪽 패널의 화살표 아이콘)를 확인한다. 끊어진 Outlet이나 Action 연결이 있는지 확인하고, 불필요하거나 잘못된 연결이 있다면 제거하고 다시 올바르게 연결한다. 겹쳐진 UI 요소 때문에 의도치 않은 객체에 연결되는 경우가 많기 때문에 확인해 본다.
- 타입 캐스팅 확인 : as? 또는 as!를 사용하여 캐스팅을 사용하는 경우, 캐스팅이 실패하여 예상과 다른 타입의 객체가 되는 경우가 있으므로 올바른 타입으로 캐스팅 되었는지 확인한다.
- 코드 검토 : 오류 메시지에 명시된 메서드 이름과 객체 타입을 바탕으로 코드에서 해당 부분을 찾는다. 메서드 이름에 오타가 없는지, 대소문자가 정확한지 확인한다. 해당 객체가 그 메서드를 가지고 있는지 확인한다
- IBOutlet 및 IBAction 재연결 : 스토리보드에서 IBOutlet, IBAction이 올바르게 연결되었는지 확인한다. 스토리보드에서 연결이 끊긴 아웃렛(Outlet)이나 액션(Action)이 있는지 확인한다. Connections Inspector에서 원 모양의 연결 아이콘 옆에 경고 아이콘이 있는지 확인하고, 끊어진 연결을 삭제한다.
- 델리게이트(Delegate) 또는 데이터 소스(DataSource) 연결 누락 : tableView.delegate = self와 tableView.dataSource = self와 같이 코드로 직접 연결하거나, 스토리보드에서 델리게이트와 데이터 소스를 연결한다.
- 심볼릭 브레이크포인트 설정 : Xcode에서 Symbolic Breakpoint를 설정하여 오류가 발생하는 정확한 호출 스택을 확인할 수 있다.
- Breakpoints Navigator (좌측 패널의 화살표 아이콘)로 이동한다.
- 하단의 + 버튼을 클릭하여 "Add Symbolic Breakpoint"를 선택하고 Symbol 필드에 - [NSObject(NSObject) doesNotRecognizeSelector:]를 입력한다.
- 앱을 다시 실행하여 오류가 발생하면, 이 브레이크포인트에서 멈추게 되고, 호출 스택(Call Stack)을 통해 어떤 코드에서 문제가 시작되었는지 확인할 수 있다.
- Zombies 도구 사용 (메모리 문제 의심 시) : 객체 해제 후 호출(Dangling Pointer) 문제라면 Xcode의 Instruments에 있는 Zombies 도구를 사용해 볼 수 있다.
- Xcode 메뉴에서 Product > Profile (또는 Cmd + I)을 선택한다.
- Zombies 템플릿을 선택하고 프로파일링을 시작한다.
- 앱에서 오류를 재현하면, Zombies 도구가 해제된 객체에 메시지가 전송된 시점을 알려준다.
- @objc 및 dynamic 키워드 확인 (Swift) : Objective-C 런타임이 필요한 경우, Swift 메서드에 @objc를 붙였는지, 필요한 경우 dynamic을 추가했는지 확인한다.
- 모듈 임포트 확인 : 특히 Objective-C와 Swift를 혼용하는 프로젝트에서 브리징 헤더에 필요한 Objective-C 헤더 파일이 제대로 포함되어 있는지 확인한다.
- 클린 빌드 : 빌드 폴더를 클린하고 다시 빌드하여, 캐시 문제나 빌드 오류를 제거한다.
'IOS > Error' 카테고리의 다른 글
| [Error] Failed to load repository owners (1) | 2025.08.11 |
|---|---|
| [Error] Thread 1: breakpoint 1.5 (4) | 2025.08.10 |
| [Error] no exact matches in call to initializer (4) | 2025.08.01 |
| [Error] Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value (5) | 2025.07.30 |