Как сделать статическую инициализацию в Какао - PullRequest
0 голосов
/ 01 мая 2011

Когда вам нужно инициализировать статическую переменную в Java, вы можете сделать что-то вроде этого:

public class MyClass {

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

Как вы можете сделать то же самое в какао?

В частности, вот что мне нужно: у меня есть приложение с большим количеством пользовательских настроек. Я хотел бы управлять всеми этими предпочтениями из одного класса, где все методы являются статическими, следующим образом:

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

Однако я не уверен, как этого добиться.

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Вы можете переопределить метод + (void)initialize для вашего объекта Objective-C.

Из Apple Docs на NSObject :

Среда выполнения отправляет инициализацию каждому классу в программе ровно один раз непосредственно перед тем, как классу или любому классу, который унаследован от него, отправляется его первое сообщение изнутри программы. (Таким образом, метод никогда не может быть вызван, если класс не используется.) Среда выполнения отправляет сообщение инициализации классам потокобезопасным способом. Суперклассы получают это сообщение раньше своих подклассов.

Вы можете использовать этот метод для инициализации статических ivars и / или NSUserDefaults

0 голосов
/ 01 мая 2011

Короче говоря, просто объявите статическую переменную в блоке реализации файла реализации вашего класса (но вне любого метода). Затем предоставьте методы доступа к статической переменной, как вы упоминали выше.

Прочитайте Переменные класса для Objective-C и посмотрите также эту запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...