Как я могу создать класс только с методами класса, способными запоминать значения? Как Core Animation делает это? - PullRequest
0 голосов
/ 21 мая 2009

У меня есть несколько полезных методов для физических расчетов, таких как ускорение / замедление, скорость и некоторые другие.

Большинство из них требуют как минимум двух измерений по времени. Поэтому каждый раз, когда я хочу использовать их, мне приходится реализовывать в моем объекте несколько переменных экземпляра, которые требуют вычисления, например, для вычисления ускорения.

Например, везде, где мне нужно рассчитать ускорение, я включаю SLPhysics.h и пишу в своем коде:

double acceleration = [SLPhysics + calculateAccelerationForFirstMeasuredSpeed:v1 secondMeasuredSpeed:v2 firstMeasuredTime:t1 secondMeasuredTime:t2];

Это отлично работает. Но я бы предпочел способ, который ведет себя как Core Animation, где большинство деталей для выполнения того, что должно быть сделано, скрыто от пользователя класса.

Итак, чтобы я не мог заставить переменные экземпляра запоминать последние измеренные значения v1 и t1, я бы предпочел простой вызов:

double acceleration = [SLPhysics + calculateAccelerationForMeasuredSpeed:v measuredTime:t context:self];

Обратите внимание на параметр контекста. Я думаю, что это путь. Но в настоящее время я не имею большого представления о том, как эти методы класса могут иметь доступ к структуре данных, например, к NSMutableDictionary. Если бы я сделал переменные экземпляра, метод класса не имел бы доступа. Если я сделаю это методом экземпляра, его использование будет уродливым и трудным для чтения, а пользователю будет мешать управление памятью и другие вещи. Также все это распределение и инициализация могут стоить слишком дорого (я думаю). Я имею в виду ... посмотрите на Core Animation. Это так просто! Я хочу то же самое для этого. Но у них тоже была эта проблема, я думаю. Они должны помнить некоторые вещи. Продолжительность анимации, контекст и т. Д.

Я думал о записи значений в файл, но это слишком дорого. Я мог бы использовать SQLite. Слишком дорогие операции, вероятно. Эти методы могут использоваться в местах, где требуется от 5 до 100 вычислений в секунду. Есть такие вещи, как «переменные класса»?

1 Ответ

4 голосов
/ 21 мая 2009

Используйте синглтон. Ваш класс хранит все его «переменные класса» как одноэлементные переменные. Реализуйте синглтон как статический метод класса:

@interface SLPhysics {
   int a;
   int b;
}

+(SLPhysics*)getSingleton;

+calculate;
@end

@implementation SLPhysics 

+(SLPhysics*)getSigleton {
 static SLPhysics* singleton;
 if (null == singleton) singleton = [[SLPhysics alloc] init];
 return singleton;
}

+calculate {
  SLPhysics* singleton = [SLPhysics getSingleton];
  // use singleton.a singleton.b here
}

@end

Добавьте безопасность потока, если необходимо.

...