2009-07-01 2 views
2

는 :NSObject를 부모 클래스로 명시하지 않는 경우는 언제입니까? 예를 들어

@interface Fraction: NSObject { 
... 

사용할 수 없습니다 NSObject 것이며 NSObject 다른 모든 클래스에 대한 궁극적 인 부모 클래스입니까?

사용 된 잘못된 용어로 자유롭게 수정하십시오.

+0

이 이전 Stack Overflow 질문에 대한 Graham Lee의 답변을 확인하십시오. http://stackoverflow.com/questions/466777/whats-the-difference-between-declaring-a-variable-id-and-nsobject –

답변

4

내가 NSView의의 서브 클래스를 작성하는 경우, 내가 작성합니다

@interface Fraction: NSView {... 

을 내 클래스는 NSView에서 상속되기 때문이다. Objective-C의 클래스는 단일 부모 클래스에서만 상속받습니다. NSView에서 (부모 클래스, NSResponder까지) 체인을 따라 가면서 결국 NSObject로부터 상속받습니다.

질문의 두 번째 부분에 대해 잘 모르겠습니다. 저는 Apple의 Cocoa Frameworks에있는 모든 클래스가 결국 NSObject를 상속 받았다고 생각합니다. 그러나 저를 인용하지 마십시오. Objective-C에서 다른 루트 객체가 존재하지 않는 이유는 없습니다 (그렇지 않으면 Objective-C는 Apple 시스템에서만 사용됩니다). 그러나 Cocoa에서는 NSObject가 루트입니다.

+0

오 이런. 나는 대답한다, 대답에 대해 감사한다! – Devoted

+1

NSProxy와 Objective-C 클래스 (프로토콜, 클래스)와 같은 몇 가지가 있습니다. –

+3

클래스는 Objective-C의 클래스가 아닙니다. id와 비슷한 데이터 유형입니다. – Chuck

5

코코아에는 NSObject와 NSProxy의 두 가지 루트 클래스가 있습니다.

NSObject는 거의 모든 코코아 개체의 루트 클래스입니다.

NSProxy는 다른 개체 또는 아직 존재하지 않는 개체의 독립 실행 형 역할을하는 개체에 대한 API를 정의하는 추상 수퍼 클래스이며 NSDistantObject와 같은 클래스의 루트 클래스입니다.

두 클래스 모두 NSObject 프로토콜을 구현합니다.

루트 클래스가없는 자신 만의 Objective C 클래스를 작성하는 것도 가능하지만 실제로는 그렇게하지 않을 것입니다. 구현하지 않는 한 많은 경우 Cocoa와 함께 사용할 수 없습니다. NSObject 프로토콜을 사용하면 심지어는 모호한 용도로 사용됩니다.

+1

수정하십시오. Objective-C에서 Object가 기본 부모 객체 인 Java와 달리 부모 클래스를 선언하지 않으면 얻을 수 없습니다. 효과적으로 클래스는 루트 클래스가되고 상속 된 동작은 0이됩니다.이것은 거의 당신이 원하는 것이 아니며 모든 종류의 이상한 컴파일러 경고를 일으킬 것입니다. –

+0

@Quinn, 그래도 가능하지만 인스턴스를 올바르게 할당하고 비트와 조각을 등록하기 위해 Objective-C 런타임 함수를 직접 호출해야합니다. 한 번 실험으로 해본 적이 있고 포기하기 전에 NSObject의 기능 근처에 아무 것도 없습니다. – dreamlax

+1

루트 클래스가 아니라 루트 객체입니다. Objective-C는 프로토 타입 기반 OO 환경이 아닙니다. – NSResponder

5

모든 Cocoa 앱에서 런타임 클래스 트리를 살펴보면 NSObject, Object, NSProxy, NSMessageBuilder 및 NSZombie의 5 가지 루트 클래스를 찾을 수 있습니다.

앱의 대부분의 일반 개체는 NSObject의 자손입니다. Object는 Objective-C 초기의 원래 루트 클래스이며, NeXT가 Enterprise Objects Framework를 개발할 때 NSObject로 대체되었습니다.

NSMessageBuilder는 메시지 전달을 위해 런타임에서 사용됩니다. NSProxy는 메시지를 마샬링하여 다른 프로세스 나 다른 호스트의 개체로 보내도록 분산 개체 구현에서 사용됩니다. NSZombie은 메모리 누수를 디버깅하는 데 사용되는 클래스입니다.