Что на самом деле делает пример Singleton в документации Apple? - PullRequest
4 голосов
/ 09 января 2012

Может ли кто-нибудь объяснить мне несколько вещей относительно реализации Singleton в документации Apple здесь.

Ссылка: - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html

Перейти к Создание экземпляра Singleton в ссылке.

Я пытался, но не мог понять несколько вещей: -

  • Что делает [super allocWithZone: NULL] в + (MyGizmoClass *) sharedManager .?
  • Почему allocWithZone вызывает метод sharedManger и возвращает вызов сохранения для его типа возврата, когда функция сохранения сама возвращает себя?
  • Если в синглтоне есть некоторые переменные экземпляра, где их следует инициализировать?

Если бы кто-нибудь мог кратко объяснить работу методов allocWithZone и sharedManager здесь, на многие из этих вопросов был бы дан автоматический ответ.

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Здесь идет - я перефразировал ваши вопросы:

Что делает [super allocWithZone:NULL]?

Это то же самое, что сказать [super alloc]. Часть withZone связана с тем, где в памяти будет храниться ваш объект. На практике это было бы очень редко, чтобы использовать это. См. Этот вопрос для получения дополнительной информации - В чем разница между alloc и allocWithZone:?

Почему метод retain возвращает себя (а не увеличивает счетчик сохранения)

Синглтоны поддерживаются в течение всего срока действия вашего приложения - вам не важен счет хранения, потому что нет ситуации, в которой вы хотели бы освободить свой синглтон. retain возвращает self в качестве вежливости и соглашения (и для разрешения вложенных выражений).

Если в синглтоне есть несколько переменных экземпляра, где их следует инициализировать?

На ваше усмотрение. Обычно вы инициализируете их в методе init, как для обычного объекта.

2 голосов
/ 09 января 2012

Эта реализация обычно считается over_kill.Существует множество способов защиты программиста от неправильного использования синглтона, что обычно не считается необходимым.

Вот пример более простой реализации из Йога :

+ (id)sharedFoo
{
    static dispatch_once_t once;
    static MyFoo *sharedFoo;
    dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; });
    return sharedFoo;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...