0

我想分类应该只初始化一次并返回一些第一次计算的值。下面是正确的方法吗?

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

3 回答 3

3

不。

  1. thisClass是一个局部变量。+userAgentString这意味着,每次调用该值都会被重置(垃圾) 。至少能做到static

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

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

请参阅在 Objective C 中使用 GCD 的 dispatch_once 创建单例在 iOS 5 中使用单例?作为正确构造单例的示例。

于 2012-05-01T18:08:01.820 回答
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;
}

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

于 2012-05-01T18:07:33.387 回答
0

http://www.galloway.me.uk/tutorials/singleton-classes/

这工作..谢谢@Inafziger

于 2012-05-01T18:16:27.860 回答