cocoa - 如何在 Cocoa 中进行静态初始化

标签 cocoa variables methods static static-initializer

当你需要在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];
}

但是,我不知道如何实现这一点。

最佳答案

您可以重写 Objective-C 对象上的 + (void)initialize 方法。

来自 Apple 文档 NSObject :

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

您可以使用该方法初始化静态 ivars 和/或 NSUserDefaults

关于cocoa - 如何在 Cocoa 中进行静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844833/

相关文章:

javascript - 如何使用 jQuery .slideUp() 使 float 按钮出现在 Angular 落?

cocoa - OS X - 应用程序在强制退出时不会显示。我该如何解决这个问题?

javascript - 如何使用变量更改目标 <a>

javascript - 编写 for 循环以使用数组创建多个方法

c++ - 从单个函数传回多个变量?

C# 变量数组

java - 直方图放大问题

objective-c - XCode - 查找某个类的对象的所有使用

objective-c - 在 Cocoa touch 之前学习 Cocoa?

cocoa - 如何在 Swift 中使用文件系统事件 API?