我正在使用我设置的单例,我用它来预加载和访问我的音频文件(sfx和音乐)我开始从AppDelegate运行[[FGAudio sharedInstance] preload];
但是担心必须记住在使用单例之前调用preload。我的问题是让事情自动化,我可以访问单例上的方法来执行我的设置和初始化的预加载,还是因为事情仍在启动而访问方法init是不明智的?
+ (FGAudio *)sharedInstance {
static FGAudio *sharedAudio = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedAudio = [[FGAudio alloc]init];
});
return sharedAudio;
}
- (id)init {
self = [super init];
if(self) {
[self preload];
}
return self;
}
答案 0 :(得分:4)
+ (FGAudio *)sharedInstance {
static FGAudio *sharedAudio = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedAudio = [[FGAudio alloc]init];
[sharedAudio preload];
});
return sharedAudio;
}
从init
引用方法并不是很糟糕,如果你能保证子类不会弄乱它或它所依赖的对象,将来你不会搞砸预加载期间通过要求在调用预加载后进入的对象。如果你使用上面的代码片段,你甚至不必担心任何这个问题,你也会得到一个预装的单例。
答案 1 :(得分:1)
Calling a method from the init method?
“是的。只是要非常小心(你的对象可能没有完全初始化,它不应该使用访问器方法以符合之前的限制,等等)”