Iphone 静态方法目标c-init一次

Iphone 静态方法目标c-init一次,iphone,objective-c,ios,alloc,Iphone,Objective C,Ios,Alloc,我想创建一个只需初始化一次并返回第一次计算的值的类。以下是正确的方法吗 @property (nonatomic, retain) NSString *userAgent; @implementation UserAgent @synthesize userAgent = _userAgent; + (NSString *) userAgentString { UserAgent *thisClass; if(self == nil) { thisC

我想创建一个只需初始化一次并返回第一次计算的值的类。以下是正确的方法吗

@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;
}

一些变化。首先,
此类
应该是静态的。第二,在静态方法中没有
self
指针,因此应该在那里使用
thisClass
。像这样:

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

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

    return thisClass.userAgent;
}

另外,一个更好的方法可能是使用一个单例,正如一位评论者所提到的。

。首先,
此类
应该是静态的。第二,在静态方法中没有
self
指针,因此应该在那里使用
thisClass
。像这样:

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

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

    return thisClass.userAgent;
}
另外,一个更好的方法可能是使用单例,正如一位评论者所提到的。

  • 此类
    是一个局部变量。这意味着,每次调用
    +userAgentString
    时,该值都将被重置(为垃圾)。至少将其设置为
    静态

  • self
    的含义不是您在类方法中所期望的。你是说这门课吗

  • 即使有了上述修复,该方法也不是线程安全的,这可能没问题,也可能没问题

  • 请参阅和作为正确构造单例的示例。

  • 此类
    是一个局部变量。这意味着,每次调用
    +userAgentString
    时,该值都将被重置(为垃圾)。至少将其设置为
    静态

  • self
    的含义不是您在类方法中所期望的。你是说这门课吗

  • 即使有了上述修复,该方法也不是线程安全的,这可能没问题,也可能没问题

  • 请参阅和作为正确构造单例的示例。

    这奏效了..谢谢@Inafziger


    这很有效..感谢@Inafziger

    搜索有关singleton's的信息,获得了一个很好的示例,说明了如何执行此操作。在UserAgent*这个类之前添加static,您应该会很好<代码>静态用户代理*thisClass搜索singleton上信息的可能重复项,这是一个很好的示例,说明了如何执行此操作。在UserAgent*thisClass之前添加static,您应该可以<代码>静态用户代理*thisClass可能重复的@i_raqz:与的第一个答案相同。@i_raqz:与的第一个答案相同。