Работа в C# и Java, я видел в основном один способ все инициализирует одиночек:Различные способы инициализации одиночек
static obj _inst = null;
obj getInstance() {
if (_inst == null) {
_inst = new obj();
}
return _inst;
}
Теперь, когда я перехожу на Objective-C для iPhone, когда я вижу примеры кода , я вижу, в основном то же самое:
static obj _inst = nil;
+ (obj *) sharedObj {
if (!_inst) {
_inst = [[obj alloc] init];
}
return _inst;
}
Там в метод класса +initialize
, что называется на каждом классе в режиме исполнения Objective-C, прежде чем она используется. Есть ли какая-то причина, по которой я не мог бы использовать это для создания своих синглонов?
static obj _inst = nil;
+ (void) initialize {
if (self == [obj class]) {
_inst = [[obj alloc] init];
}
}
+ (obj *) sharedObj {
return _inst;
}
Это прекрасно работает, когда я пытаюсь это в моем коде, и он избавляется от проверки, чтобы увидеть, если она существует каждый раз, прежде чем он доступен. Есть ли какая-то причина, по которой я не должен создавать одиночные игры таким образом?
except + initialize вызывается только в первый раз, когда доступ к классу осуществляется в любом случае. –
Хорошая точка. Я стою исправлено. –
Просто отметим, что есть случай (и это действительно крайний случай здесь), что + initialize можно вызвать более одного раза. Возьмем, к примеру, класс A и класс B, являющийся подклассом класса A. Класс A реализует + инициализацию, но класс B не является. Когда + initialize отправляется в класс B, поскольку он не реализует его собственный, используется его суперкласс (класс A) + initialize. И поэтому класс A + intialize вызывается более одного раза. Во всяком случае, ваш чек в + инициализировать достаточно, чтобы это не повлияло на вас. Просто поместите его там для знания и полноты. :) –