2009-07-01 2 views
2

Например:Когда NSObject не указывается как родительский класс?

@interface Fraction: NSObject { 
... 

Когда не NSObject будет использоваться и NSObject конечной родительский класс для всех других классов?

Пожалуйста, не стесняйтесь исправить меня по любой неправильной терминологии.

+0

Отметьте ответ Грэма Ли на этот предыдущий вопрос о переполнении стека: 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.

Я не уверен во второй части вашего вопроса. Я думаю, что все классы в Cocoa Framework от Apple в конечном итоге наследуются от NSObject, но не цитируйте меня на этом. В Objective-C нет причин, почему не может быть других корневых объектов (иначе Objective-C будет использоваться только в системах Apple). Однако в Cocoa NSObject является корнем.

+0

oh duh. я вижу, спасибо за ответ! – Devoted

+1

Есть несколько таких, как NSProxy и классы Objective-C (Protocol, Class) –

+3

Класс не является классом в Objective-C - это тип данных, похожий на id. – Chuck

5

Какао имеет два класса корней: NSObject и NSProxy.

NSObject - это класс корней почти всех объектов какао.

NSProxy - это абстрактный суперкласс, определяющий API для объектов, которые действуют как stand-ins для других объектов или для объектов, которые еще не существуют, и являются корневым классом для классов, таких как NSDistantObject.

Оба класса реализуют протокол NSObject.

Также возможно написать собственные классы Objective C, у которых нет корневого класса, но вы, вероятно, никогда этого не сделаете, и вы не сможете использовать его с Cocoa для большей части всего, если только вы не внедрили протокол NSObject, и даже тогда это было бы сомнительным использованием.

+1

Исправить. В отличие от Java, где Object является родительским объектом по умолчанию, в Objective-C, если вы не объявляете родительский класс, вы его не получите. Эффективно, ваш класс становится корневым классом, и вы получаете нулевое унаследованное поведение.Это почти никогда не то, что вы хотите, и вызовет всевозможные странные предупреждения компилятора. –

+0

@Quinn, это возможно, но это связано с вызовом функций времени выполнения Objective-C напрямую, чтобы правильно распределять экземпляры и регистрировать биты и фрагменты. Я делал это один раз в качестве эксперимента и почти не приближался к функциональности NSObject, прежде чем сдаваться. – dreamlax

+1

Корневой класс, а не корневой объект. Objective-C не является основанной на прототипе средой OO. – NSResponder

5

В любом приложении Cocoa, если вы изучите дерево классов времени выполнения, вы найдете пять корневых классов: NSObject, Object, NSProxy, NSMessageBuilder и NSZombie.

Большинство обычных объектов в вашем приложении будет происходить из NSObject. Объект является исходным корневым классом с первых дней Objective-C, и он был заменен NSObject, когда NeXT разрабатывал Framework Enterprise Objects.

NSMessageBuilder используется во время выполнения для пересылки сообщений. NSProxy используется реализацией распределенных объектов для обработки маршалинговых сообщений для отправки объектам в других процессах или даже на других хостах. NSZombie - это класс, который используется для отладки утечек памяти.