0

当你需要在 Java 中初始化一个静态变量时,你可以这样做:

public class MyClass {

  private static Object someStaticObject;
  static {
    // initialize  someStaticObject here
  }
  ...

你怎么能在 Cocoa 中做同样的事情?

具体来说,这就是我所追求的:我有一个具有大量用户偏好的应用程序。我想从一个所有方法都是静态的类中管理所有这些首选项,如下所示:

@implementation Preferences

    +(void)setMotion:(BOOL)isMotion {
      [[NSUserDefaults standardUserDefaults] setBool:isMotion forKey:keyIsMotion];
      [[NSUserDefaults standardUserDefaults] synchronize];
    }

    +(BOOL)isMotion {
      [[NSUserDefaults standardUserDefaults] boolForKey:keyIsMotion];
    }

这样我就可以在我的代码中的任何地方轻松访问和设置我的偏好:

[Preferences setMotion:TRUE];  

或者

if ([Preferences isMotion]) {
  ...

鉴于我计划有数十个静态方法,它希望有一个静态变量默认值定义如下:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

这样我上面的代码就可以变成:

+(void)setMotion:(BOOL)isMotion {
  [defaults setBool:isMotion forKey:keyIsMotion];
  [defaults synchronize];
}

+(BOOL)isMotion {
  [defaults boolForKey:keyIsMotion];
}

但是,我不确定如何做到这一点。

4

2 回答 2

1

您可以覆盖+ (void)initializeObjective-C 对象上的方法。

来自NSObject上的 Apple Docs :

运行时恰好在程序中的每个类或从它继承的任何类从程序中发送其第一条消息之前一次向程序中的每个类发送初始化。(因此,如果不使用该类,则可能永远不会调用该方法。)运行时以线程安全的方式将初始化消息发送到类。超类在其子类之前收到此消息。

You can used that method it initialize static ivars and or NSUserDefaults

于 2011-04-30T23:35:25.320 回答
0

简而言之,只需在类的实现文件的实现块中声明静态变量(但在任何方法之外)。然后像上面提到的那样为静态变量提供访问器方法。

阅读Objective-C 的类变量并查看这篇文章

于 2011-04-30T22:07:00.027 回答