Ответ 1
+initialize
не вызывается, пока вы не отправите какое-либо сообщение экземпляру класса. Вы отправили сообщение?
Одна из возможных проблем может заключаться в том, что вы отправили сообщение в g_ResManager
из другой части вашего кода?
Это не сработает, потому что:
-
g_ResManager
равен нулю во время запуска. - Вы отправляете сообщение
g_ResManager
, котороеnil
. - Что означает Objective-C время выполнения, как "отправка сообщения в класс", это не то, что он выглядит синтаксически в исходном коде, а реальный объект и отправленное сообщение.
- Итак, в этом случае
nil
получает сообщение,nil
не является экземпляромResourceManager
, поэтому+initialize
также не вызывается.
Я бы изменил ваш код следующим образом: во-первых, в .m,
static ResourceManager *g_ResManager;
@implementation ResourceManager
//initialize is called automatically before the class gets any other message
+ (void) initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
g_ResManager = [[ResourceManager alloc] init];
}
}
+(ResourceManager*)sharedResourceManager
{
return g_ResManager;
}
...
@end
а затем в .h, я бы просто имел
@interface ResourceManager:NSObject {
...
}
+(ResourceManager*)sharedResourceManager
@end
Затем вы всегда можете использовать [ResourceManager sharedResourceManager]
.
На самом деле, как говорит Роб в комментарии, вы можете полностью отказаться от +initialize
в этом случае. Измените .m на что-то вроде
@implementation ResourceManager
+(ResourceManager*)sharedResourceManager
{
static ResourceManager *g_ResManager=nil;
if(!g_ResManager){
g_ResManager=[[ResourceManager alloc] init];
}
return g_ResManager;
}
...
@end
Это идиома, которую я всегда использую лично. Но я предупреждаю вас, что это не полностью потокобезопасно! Он должен быть в порядке, если вы вызываете [ResourceManager sharedResourceManager]
один раз перед тем, как создавать нересты, что я почти всегда буду делать, но это одна вещь, о которой нужно помнить. С другой стороны, версия, использующая +initialize
, должна быть потокобезопасной, как есть, благодаря четко определенному поведению +initialize
. См. Обсуждения в этом сообщении в блоге.