Как понимать NSObject, это и протокол, и интерфейс - PullRequest
2 голосов
/ 23 июня 2010

Вы можете увидеть следующее в файле NSObject.h

// 1. вот протокол

@protocol NSObject

// 2. вот интерфейс, соответствующий вышеуказанному протоколу

@interface NSObject <NSObject> {
    ...

// 3. Что означает "()" ниже? NSCoderMethods - это протокол

@interface NSObject (NSCoderMethods)

NSObject настолько важен, что мне нужно понять, почему он так устроен?

1 Ответ

5 голосов
/ 23 июня 2010

1.

Это класс (интерфейс), поскольку все конкретные классы в ObjC в настоящее время наследуют реализации от NSObject, чтобы поддерживать такие функции, как подсчет ссылок и проверка типов во время выполнения.


2

Теперь для протокола ... он существует, потому что NSObject - не единственный корневой класс, который поддерживает методы -retain и -performSelector: и т. Д.

Одним из важных классов является NSProxy , который действует как прокси для пересылки сообщений некоторым реальным объектам.

Целями NSProxy обычно являются объекты NSObject, поэтому интерфейс должен также поддерживать методы -retain и -performSelector: и т. Д. Но NSProxy не может наследовать от NSObject, потому что между ними нет is-a отношений.

Чтобы выразить родственные отношения, оба они должны принять один и тот же протокол, который, к сожалению, также называется NSObject.

Создание NSObject протокола также имеет то преимущество, что пользовательские протоколы могут запрашивать у пользователей поддержку всех обычных операций NSObject с помощью

@protocol Foo <NSObject>
...

3.

Это категория , которая добавляет дополнительные реализации метода в NSObject.

...