【问题标题】:static method objective c - init once静态方法目标 c - 初始化一次
【发布时间】:2012-05-01 17:57:37
【问题描述】:

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

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

【问题讨论】:

  • 搜索关于单身人士的信息以获得如何做到这一点的好例子。
  • 在 UserAgent *thisClass 之前添加静态,你应该没问题。 static UserAgent *thisClass;

标签: iphone objective-c ios alloc


【解决方案1】:

没有。

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

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

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

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

【讨论】:

【解决方案2】:

一些变化。首先,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;
}

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

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2012-01-01
      • 2018-10-06
      • 1970-01-01
      相关资源
      最近更新 更多