Какие варианты использования существуют для определения нового корневого класса? - PullRequest
11 голосов
/ 28 ноября 2010

Мы знаем, что в Objective-C есть два основных корневых класса: NSObject и NSProxy.Существуют и другие корни (в основном для личных и унаследованных целей), такие как Object и NSLeafProxy.

Определение нового корня довольно тривиально:

@interface DDRoot <NSObject>

@end

@implementation DDRoot

//implement the methods required by <NSObject>

@end

Мой вопрос: почемуВы когда-нибудь хотели бы определить новый корневой класс?Есть ли какой-нибудь вариант использования, где это необходимо?

Ответы [ 4 ]

12 голосов
/ 28 ноября 2010

Существует две основные причины для создания нового корневого класса; проксирование и новая объектная модель.

При проксировании может быть полезно реализовать новый корневой класс, так что вы можете в основном обрабатывать любое и все поведение класса / объекта нестандартным способом. См. NSProxy.

Среда выполнения Objective-C достаточно гибкая, что позволяет довольно легко поддерживать новую объектную модель (где легко в первую очередь обесценивает сложность создания такого зверя). На самом деле, многие из поведений, которые считаются присущими среде выполнения - KVC, KVO и т. Д. - реализованы как часть самого класса NSObject.

Я знаю, по крайней мере, одну компанию, которая, по крайней мере, примерно 8 лет назад, внедрила свою собственную объектную модель как часть создания механизма финансового анализа ~ 500 тыс. LOC.

Суть в том, что если вы идете по этому пути, вы не пытаетесь заставить ваши классы взаимодействовать с Foundation / CF / AppKit / UIKit и т. Д. Если вам нужен , то это , просто подкласс NSObject уже!

Интересно отметить, что NSManagedObject фактически является корневым классом в том смысле, что он выполняет довольно серьезные пользовательские функции, но это подкласс NSObject, поэтому подклассы NSManagedObject могут взаимодействовать с остальными система.

8 голосов
/ 28 ноября 2010

Насколько я могу судить, не должно быть никаких причин для создания собственного корневого класса, потому что если вы сами не реализуете все методы протокола NSObject, вы упустите множество функциональных возможностей, и я собираюсь сделать много обращений к среде выполнения Objective C, что по сути должно быть сделано для вас.

Если вам действительно не пришлось реализовывать протокол иначе, чем по умолчанию (NSProxy - это особый случай, который делает ), вам не нужно создавать свой собственный корневой класс. Я имею в виду, что вам нужно написать класс, который не может принципиально быть представлен NSObject и протоколом, реализованным Apple, и в этом случае, почему вы вообще пишете его в Objective-C

Это то, что я думаю. Может быть, кто-то может придумать для этого творческое использование.

(Люди, изучающие эту тему, должны обратиться к справочнику по классу NSObject , справочнику по протоколу NSObject , «Основные компетенции: корневой класс», документ , и Раздел «Root Class» Основы: документ «Объекты какао» .)

5 голосов
/ 28 ноября 2010

Objective-C и Cocoa - это разные вещи, и в принципе можно определить совершенно новые прикладные среды, которые не используют Foundation.Упомянутый bbum финансовый анализ - это практический пример, и я считаю, что они все еще существуют.

Еще один способ - создать прокси-сервер, который будет более минимальным, чем NSProxy, как это делает Майк Эш здесь .

Да, а приватный NSInvocationBuilder является корневым классом, предположительно по тем же причинам, что и прокси Майка.Захват вызовов для последующего использования - это то, что можно захотеть воссоздать.

1 голос
/ 28 ноября 2010

Такие компании, как OmniGroup, определили версию NSObject для использования в качестве собственного базового класса для всего.

По сути, это подкласс NSObject с некоторыми отладочными материалами.Кроме этого, обычно ужасная идея бороться с фреймворком.

Найти код Омни здесь: https://github.com/omnigroup/OmniGroup

...