Существует несколько причин, по которым Cocoa поощряет использование [Foo sharedFoo]
вместо глобального объекта Foo.
[Foo sharedFoo] может автоматически создавать экземпляр при первом использовании.
Именование экземпляра заглавной буквой очень запутанно, потому что это похоже на класс, поощряя ошибки. Последовательность в именовании лежит в основе хорошего Objective-C. Компилятор не может защитить вас от множества ошибок, потому что ObjC очень динамичен. Хорошее именование и самодисциплина в последовательности - вот что приводит к безошибочному Какао.
Параллелизм:
Foo *foo = [Foo sharedFoo];
Foo *foo = [[[Foo alloc] init] autorelease];
Foo *foo = [Bar fooAtIndex:0];
Все три из них могут быть законными в одной программе. Тот факт, что существует единственный экземпляр, не означает, что других экземпляров тоже нет. NSNotificationCenter является хорошим примером этого. Это синглтон, но вы можете создавать дополнительные экземпляры (и для этого есть причины).
Глобальная переменная может быть изменена глобально. A sharedInstance
не может быть. Например, если State
является глобальной переменной (а не классом), то State=nil
допустимо в любой части программы. Это нарушает инкапсуляцию и является простой опечаткой для state=nil
, которая не может быть перехвачена компилятором. Если State
является классом, то компилятор может отловить эту простую ошибку.
Множество правил именования Какао призваны поощрять хорошо читаемый код и минимизировать ошибки в высокодинамичной и слабо типизированной среде. Как и в Perl use strict
, мы должны быть очень осторожны, прежде чем отказываться от той маленькой сетки безопасности, которая у нас есть.