Имеют ли синглтоны какой-либо смысл в контексте Objective-c?

#objective-c #singleton

#objective-c #синглтон

Вопрос:

Я родом из среды java / cpp, где синглтоны имеют свои преимущества перед методами класса (статическими), однако в objective-c из-за его динамической природы, по моим прошлым наблюдениям, на самом деле нет преимущества в использовании синглтона над методом класса. Может ли кто-нибудь подтвердить это или, возможно, привести примеры, когда синглтон может делать то, чего не может метод класса (но за исключением случая, когда синглтон на самом деле является «многотонным»)

РЕДАКТИРОВАТЬ: я знаю, что такое синглтоны и методы класса, и это не вопрос концепции, скорее: может ли метод класса полностью заменить синглтон в objective-c, делая реализацию singleton бесполезной?

Ответ №1:

Синглтоны используются в Objective-C. В Cocoa framework примерами синглтонов являются NSApplication, NSDocumentController и NSWorkspace.

Преимущество использования синглтона перед методом класса заключается в том, что поведение синглтона можно изменить, создав подкласс. Это несколько редко, но некоторые приложения действительно создают подклассы NSDocumentController или NSApplication. (Например, вы можете переопределить метод NSDocument -documentClassForType: ).

Комментарии:

1. Спасибо за ответ, Дитрих, хорошие замечания и хорошие примеры. Однако вы также можете «переопределить» метод класса, используя категории. NSApplication , NSDocumentController — хорошие примеры, которые заставляют меня думать, что должна быть причина, по которой они решили сделать это так. В любом случае, что я пытаюсь выяснить, так это то, что если я собираюсь начать использовать методы класса вместо синглтонов, столкнусь ли я с проблемами позже? Хорошее ли это решение? Мне, конечно, больше нравятся методы класса, потому что они не требуют абсолютно никакой дополнительной настройки и выглядят лучше. Еще раз спасибо за ответ.

2. Если вы переопределяете методы, используя категории, как вы вызываете исходный метод? С помощью подклассов вы можете использовать super .