Apple с тех пор обновила рекомендуемый одноэлементный код для прохождения статического анализатора:
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedManager] retain];
}
Теперь +sharedManager
вызывает super * -allocWithZone:
и присваивает возврат -init
, а одиночный -allocWithZone:
просто возвращает сохраненный sharedInstance.
Редактировать:
Зачем сохранять в + allocWithZone:?
+ allocWithZone: переопределяется, потому что кто-то, использующий MyGizmoClass, может обойти синглтон, вызвав [[MyGizmoClass alloc] init] вместо [MyGizmoClass sharedManager]. Он сохраняется, поскольку ожидается, что + alloc всегда будет возвращать объект со счетом сохранения + 1.
Каждый вызов + alloc должен быть сбалансирован с -release или -autorelease, поэтому без сохранения в + allocWithZone: общий ресурс может потенциально быть освобожден из-под других пользователей.