2012-07-27 3 views
6

iOS6 베타 3을 사용하는 동안 이것을 알아 냈습니다이제 Xcode에서 빈 범주를 생성합니다. 왜?

UIViewContoller의 새 하위 클래스를 만들 때 (다른 상위 클래스는이 동작을 생성하지 않습니다) .m 파일의 맨 위에 빈 범주가 있습니다. 파일의 과거에 카테고리에 대해 배울 때 나는 어떤 사람들이 개인적인 방법을 나타 내기 위해이 같은 기술을 사용하게된다는 것을 알아 차렸다.

의도가 여기에 있습니까? 실제로 사적인 것을 사적인 것으로 바꾸는 데 변화가 있었습니까? 나는 거기에서도 @private 지시어를 주목한다.

개인용 바 (vars) 및 방법에 관한 귀하의 개인 코딩 스타일은 무엇입니까?

업데이트 : XCode가 클래스 확장을 사용하도록 유도했기 때문에이 프로젝트의 개인 메소드/ivar에 사용했습니다. 나는 단점을 발견했다. 나는 그것이 모두 UIButtons, UILabels, 등등과 함께 서브 클래 싱 된 UIViewControllers 중 하나를 재사용 할 수있는 것을 보았다 .... 나는이 상속했다 : UIViewController < - FirstViewController < - SecondViewController.

음, FirstViewController의 클래스 확장에 넣은 모든 개인 메서드가 SecondViewController에서 코드를 작성할 때 자동 완성에서 팝업되지 않습니다. 약간의 짜증 ....

+0

Rob의 반응은 좋았지 만 ... XCode가 UIViewController의 하위 클래스에 대해서만 생성하고 모든 클래스가 아닌 이유는 누구나 알 수 있습니까? (어떤 다른 사람들에게는 그것을 할 수도 있지만, 확장하는 일반적인 클래스는이 행동을 나타내지 않습니다.) – VaporwareWolf

답변

19

는이 인터페이스 정의를 참조하고 있습니다 :

@interface MYViewController() 
@end 

이 기술적으로 클래스 확장보다는 범주입니다. 범주에는 괄호 안에 문자열이 있습니다. 클래스 확장은 컴파일 타임에 클래스에 추가되므로 ivars (대개 속성의 형태로)를 추가 할 수 있습니다. 카테고리는 런타임에 추가되며 ivars를 추가 할 수 없습니다.

모두 당신의 요점은 정확합니다. 이 메서드는 private 메서드와 속성을 정의하는 데 사용됩니다.

ObjC 세계에서 "개인"은 "침입 금지"기호이며 면도기 벽이 아닙니다. 컴파일러 적용을 추가하는 @private 키워드가 있지만 ivars에만 적용되며 일반적으로 필요하지 않습니다. 이러한 유형의 경고 기반 개인 정보는 ObjC에서 매우 잘 작동하며 매우 충분합니다.

이 클래스 확장에 비공개 속성을 추가하면 외부 호출자는 정의되지 않은 메서드 호출과 마찬가지로 액세스하려고하면 "선택기에 응답하지 않을 수 있습니다"라는 경고를 받게됩니다. ObjC 프로젝트에 경고가 존재하도록해서는 안되기 때문에 데이터 캡슐화가 강제됩니다. 그들은 개인 경우


편집

은, 그들은 당신의 하위 클래스에서 팝업 안된다. 당신이 원하는 것은 보호됩니다. ObjC에서 보호 된 메서드에 대한 훌륭한 계획은 없지만 일반적인 기술은이를 MYViewController + Protected.h와 같은 .h 파일의 범주에 넣는 것입니다. 너무나 좋은 ObjC 디자인은 서브 클래 싱을하지 않기 때문에 이것이 거의 드문 경우입니다. 대신 컴포지션과 위임을 사용합니다.

"왜 컨트롤러 만 보는가?" 첫째,보기 컨트롤러가 아닙니다. iOS (well, VC, TableViewController 및 GLKViewController)의보기 컨트롤러 일뿐입니다. Mac에서는 윈도우 컨트롤러 및 스포트라이트 가져 오기 도구이기도합니다.찾는 위치 :

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates 
.../Library/Xcode/Templates 

왜 그런가? 글쎄, 그것들은 모두 컨트롤러이고, 컨트롤러가 사적인 속성을 필요로하는 것은 아주 일반적입니다. 사실 컨트롤러에 사유 재산이 없다면 아마 너무 많이 공개하게 될 것입니다. 모델 및 뷰 클래스의 보편적이지 않습니다. 나는 그들이 그 결정에 참여한 것으로 의심한다. 템플릿을 소유 한 다른 사람들이거나 다른 시간에 업데이트 된 사람들 일 수도 있습니다. 때로는 시간이 지남에 따라 부드럽게 나타나는 불일치가 거의 없습니다.

자신 만의 템플릿을 만들 수도 있습니다. Creating Custom Xcode 4 File Templates을 참조하십시오.

+0

완벽한 답. 고맙습니다! – VaporwareWolf

+0

@HCHogan이 질문에 대한 답변이 있으면 답변으로 표시하십시오 (게시물 왼쪽의 체크 표시). 감사. – Stunner

관련 문제