2010-08-18 3 views
4

를, 그것은 NSObject를 상속하지되지 않도록목표 - C : 정적 메서드 내 클래스는 "methodSignatureForSelector를 구현하지 않습니다 - 앞서 문제"나는 정적 메소드가 유틸리티 클래스가

(오른쪽 필요가?)

컴파일 할 때 전혀 경고가 없습니다.

문제는 iPhone 시뮬레이터에서 실행할 때 발생합니다. "methodSignatureForSelector가 구현되지 않습니다. - 문제가 있습니다." 글쎄, 나는 "앞쪽에서 문제가있다"고 말하는 디버거의 말을 들어 본 적이 없다. 하지만 내가 싫어하는 것은 오류 자체입니다 ... 왜 정적 메서드를 명확하게 호출 할 때 클래스에서 methodSignatureForSelector를 구현해야합니까? (+)

고마워요! 다니엘

+6

NSObject에서 상속하는 것은 프로그램의 크기 나 성능에 눈에 띄는 차이를 만들지 않을 것입니다. * 상속하지 않으면 더 고통 스러울 것입니다. – dreamlax

답변

10

이것은 코코아의 관용적 패턴이 아닙니다. 나는 당신의 디자인을 다시 생각해 보길 강력히 권합니다. 이것은 Java 또는 C++가 아닙니다. 한 가지는 "정적 메서드"와 같은 것조차 없다는 것입니다. 클래스는 객체 자체 인 클래스 메서드입니다.

NSObject의 하위 클래스가 아니며 (기본 동작과 다른 이유로 "필요하지 않음"은 매우 합리적인 이유가 아닙니다.) 심지어 클래스 메서드 만 사용하는 클래스가있는 경우에도 매우 이상합니다. 클래스는 상태를 유지할 필요가 있는지 여부에 따라 아마도 싱글 톤이거나 제거 된 메소드를 함수로 변환해야합니다.

정확한 이유는 코드를 보지 않고도 말하기 어렵습니다. 그 경고만으로도 프로그램을 중단해서는 안됩니다. 런타임에서 메시지를받는 모든 클래스에 해당 메시지를 보내기 때문에 아무 것도 수행하지 않더라도 +initialize의 구현이 필요합니다. 아마도 오류가 발생하는 곳입니다. 메시지를 보내면 런타임에서 initialize을 보내고 클래스가 응답하지 않고 런타임이 전달 기계를 호출하려고 시도 할 수 없습니다.

-2

답변 해 주셔서 감사합니다.

'정적'대 '클래스 방법'에 대해서 AFAIK는 이름을 짓는 것일뿐 실제적인 차이는 없습니다. '함수/메소드'및 '메시지'와 같습니다.

그러나 이것은 반드시 '잘못된'디자인 일 필요는 없습니다. 먼저 ObjC에는 네임 스페이스가 없다는 것을 기억해야합니다. 따라서 어떤 순서를 지정하는 유일한 방법은 클래스입니다. 왜냐하면 두 함수의 이름이 충돌하면 컴파일러는 큰 소리로 외칠 것입니다. 때때로 'Utility'함수이고 다른 개체에서 작업하거나 특정 계산을 수행하는 특정 함수를 직접 관리 할 수있는 특정 함수가있을 수 있습니다. 불필요한 오버 헤드.

매우 숙련 된 C/C++/Asm/Others 프로그래머로서 ObjC에서 프로그래밍 할 때 성능상의 이유로 항상 메모리를 공개하는 경향이 있습니다. 같은 이유로, 필자는 불필요한 오버 헤드를 생성하고 싶지 않습니다. 그리고 ObjC에는 많은 오버 헤드가 있습니다.

도큐멘트는 NSObject에서 반드시 상속 받았다고 말하지 않으며 프레임 워크가 올바르게 관리하기를 원할 때 말합니다.

하지만 관리 할 필요가 없다는 것을 이해 했으므로이 함수는 클래스 이름의 네임 스페이스 안에 래핑 된 함수 여야합니다.

약 + initiallize - 클래스가 NSObject에서 상속하는 경우에만 재정의 할 수 있습니다.그래서 원래의 질문은 여전히 ​​존재합니다. NSObject에서 서비스를 원하지 않는다면 NSObject를 상속해야하는 이유는 무엇입니까? 나는 그것의 인스턴스와 아무 상관이 없으므로 클래스를 할당하거나 초기화 할 필요가 없다!

또한 ObjC의 이상한 점은 클래스 메서드를 재정의 할 수 있다는 것입니다.

+0

예, "정적"및 "클래스"방법에는 실제 차이가 있습니다. "정적"메소드는 함수에 대한 구문 적 설탕이지만 Objective-C 클래스 메소드는 클래스 객체에 전송되는 실제 동적 다이 딩 메소드입니다. 이것이 당신 자신이주의하는 것처럼, 당신이 그것을 무시할 수있는 이유입니다. 이것은 또한 클래스 메소드를 호출하는 오버 헤드가 있음을 의미하므로, 자신의 논리로 불필요하게 사용하면 안됩니다. –

+2

방법과 메시지도 다른 개념입니다. Objective-C의 메시지 식은 메서드를 직접 호출하지 않습니다. (예 : 전달 또는 동적으로 메소드를 추가하여) 사용자 정의 할 수있는 메커니즘을 통해이를 디스패치합니다. 일반적으로 메소드와 메시지 사이에는 일대일 관계가 있지만 항상 그런 것은 아닙니다. –

+0

글쎄 내가 여기서 쓴 글을 다시 읽은 후에, 나는 네가 지적한대로 내가 방금 나 자신에게 대답했다는 것을 이해했다 ... 그리고 나는이 난장판이 어디에서 왔는지 알았다고 생각한다. ObjC의 본성 ... 그들은 어떤 괴상한 언어와 C를 결합한 결과는 다음과 같습니다. ObjC에는 실제로 '클래스'가 없습니다. 일부 관리 데이터를 간단한 데이터 구조로 캡슐화하여 에뮬레이션합니다. 나는이 모든 포인터가 항상 클래스에 연결되어 있고, "isa"와 다른 것들을 포함하여이 이전 버전을 보지 못한 이유를 알지 못합니다. 이것은 단지 모든 것을 설명합니다 – Daniel

관련 문제