静态方法目标c - init一次

时间:2012-05-01 17:57:37

标签: iphone objective-c ios alloc

我想要只应初始化一次并返回一些第一次计算的值。低于正确的方法吗?

@property (nonatomic, retain) NSString *userAgent;

@implementation UserAgent
@synthesize userAgent = _userAgent;


+ (NSString *) userAgentString
{
    UserAgent *thisClass;
    if(self == nil)
    {
        thisClass = [[UserAgent alloc] init];
    }

    if (thisClass.userAgent == nil)
    {
        return @"not initialized";
    }

    return thisClass.userAgent;
}

3 个答案:

答案 0 :(得分:3)

没有

  1. thisClass是一个局部变量。这意味着,每次调用+userAgentString时,该值都将被重置(为垃圾)。至少使它成为static

  2. self的含义不是您在类方法中所期望的。你的意思是thisClass

  3. 即使进行了上述修复,该方法也不是线程安全的,可能会也可能不会。

  4. 请参阅Create singleton using GCD's dispatch_once in Objective CSingleton in iOS 5?作为正确构建单身的示例。

答案 1 :(得分:0)

一对夫妇的变化。首先,thisClass应该是静态的。其次,静态方法中没有self指针,所以你应该在那里使用thisClass。像这样:

+ (NSString *) userAgentString
{
    static UserAgent *thisClass;
    if(thisClass == nil)
    {
        thisClass = [[UserAgent alloc] init];
    }

    if (thisClass.userAgent == nil)
    {
        return @"not initialized";
    }

    return thisClass.userAgent;
}

此外,更好的方法可能是使用Singleton,如评论者所述。

答案 2 :(得分:0)