如何使用类变量?

时间:2012-09-02 07:23:00

标签: objective-c

我有一个类方法loadImage:(NSString *)path来从路径加载图像,如果路径为nil,则加载默认路径图像。

 +(NSImage *) loadImage:(NSString *)path{
   if(path== nil){
    path = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
  }
}

因为默认路径总是使用相同的路径,所以如果我运行方法1000次,我想只计算一次路径,比如

if(defaultPath == nil){
    defaultPath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
}
path = defaultPath;

,我想我可以使用静态变量,但我不知道怎么做,请帮助我,我很高兴知道有关提高性能的任何建议。

2 个答案:

答案 0 :(得分:3)

只需使用静态变量来保存默认路径:

static NSString *defaultPath = …;
if (path == nil) {
   path = defaultPath;
}

但如果你出于性能原因这样做,首先要确保它是值得的。最有可能的是,这是一个不值得麻烦的过早优化。

答案 1 :(得分:1)

有一种基于GCD的有用模式可以很好地处理这种情况:

+(NSImage *) loadImage:(NSString *)path{

    static NSString *storedPath;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        storedPath = [[NSBundle mainBundle] pathForResource:@"default" ofType:@"png"];
    });

    // Do whatever you need to do with the default resource path.
}

dispatch_once完全符合您的要求 - 它确保初始化代码只运行一次。它也是线程安全的。

Xcode的代码完成甚至可以帮助您使用该模式 - 如果您开始输入dispatch_once,那么您将直接获得onceToken模板。