2012-01-03 2 views
15

해당 XIB 파일에서 "File 's Owner"인보기 컨트롤러 또는 창 컨트롤러가 있다고 가정 해 봅시다.구현 (.m) 파일의 IBOutlet 인스턴스 변수

Controller Builder에서 IBOutlet을 가지고있는 것이 일반적입니다 (인터페이스 빌더를 사용하여 XIB에 연결할 수 있음).

지금까지 인터페이스 (.h) 파일에 IBOutlet 인스턴스 변수를 생성했습니다. 그러나 (여러분 모두 아시다시피) IBOutlet은 매우 자주 컨트롤러 클래스의 개인 메커니즘입니다. 외부인은 그들에 대해 알지 않아야합니다.

이것이 Objective-C가 최근에 구현할 수있는 기능을 제공하기 시작한 이래로 내 IBOutlet을 모두 구현 (.m) 파일에 넣기를 원하는 이유입니다.

나는이 일을 시도하고 이것은 잘 작동하는 것 같습니다. 내 질문은 다음과 같습니다. 왜 작동합니까? 인터페이스 빌더는 클래스의 헤더 파일 만 볼 수 있었지만 구현 파일은 들여다 보지 못했습니다. 내가 잘못? 어떻게 Interface Builder가 구현 파일을 "볼"수 있습니까? 구현 파일에 IBOutlet 인스턴스 변수를 넣는 것이 잠재적으로 위험 할 수 있습니까?

+1

Mac에서 최신 런타임을 사용할 때만 가능하며 64 비트 만 의미합니다. 클래식 런타임에서는 모든 ivars를 헤더에 선언해야합니다. –

답변

12

Xcode 4 User Guide

주에서 : 엑스 코드 4는 헤더 파일과 색인에 대한 파일, 당신은에 배치 할 필요없이 구현 (하는 .m) 파일의 행동과 콘센트를 정의 할 수 있습니다 구현 모두를 분석하기 때문에 헤더 파일을 사용하고 nib 파일에서 구현 파일로 직접 연결할 수 있습니다. 따라서 수업을 사용하고있는 고객에게 부분의 인터페이스 나 작업을 노출 할 필요가 없습니다.

구현 파일에 IBOutlet 인스턴스 변수를 삽입하는 것이 잠재적으로 위험 할 수 있습니까?

예, 그렇지만 실행 시간에 액세스 범위가 없기 때문에 선언 된 메소드에 액세스 할 수 있습니다. 메소드에 액세스 할 수없는 경우에도 런타임에 분석이 수행되며 메소드에 액세스 범위 정보가 첨부되지 않습니다. 그럴 수도 있지만 Objective-C에는 private, protected 등이 C++ 또는 Java처럼 부족합니다. 이러한 동작을 구현하면 런타임에 훨씬 더 느려질 것입니다.

+1

구현 파일에서 IBOutlet ivars를 사용하면 잠재적으로 위험 할 수 있습니다. –

+0

코드의 일부는 의도적으로 설계상의 위험에 처한 OOP 패러다임 – Geoffroy

+0

@ Geoffroy에 대한 개인 데이터에 의도적으로 액세스하기 때문에 구현 파일에'IBOutlet'과'IBAction'을 넣는 것은 나쁜 생각이라고 생각하기 때문에 만? – Enchilada