从init访问self的方法?

时间:2014-03-13 14:43:02

标签: ios objective-c

我正在使用我设置的单例,我用它来预加载和访问我的音频文件(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;
}

2 个答案:

答案 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?

“是的。只是要非常小心(你的对象可能没有完全初始化,它不应该使用访问器方法以符合之前的限制,等等)”