Как я могу создать класс только с методами класса, который способен запоминать значения? Как Core Animation делает это?

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

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

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

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

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

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

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

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

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


person Thanks    schedule 21.05.2009    source источник


Ответы (1)


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

@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

При необходимости добавьте потокобезопасность.

person Remus Rusanu    schedule 21.05.2009
comment
Если я правильно понимаю, будет только один экземпляр класса SLPhysics. Но кому он принадлежит? Кто отвечает за освобождение объекта, когда он больше не нужен? Или мне не нужно беспокоиться о его выпуске, поскольку он будет храниться, пока работает мое приложение? - person Thanks; 21.05.2009
comment
Есть один статический экземпляр, созданный в методе getSingleton, который существует на протяжении всего времени работы вашего приложения. Ничто не владеет им и не нуждается в управлении его памятью, поскольку оно останется, пока работает ваше приложение. Использование памяти для этого одного класса будет тривиальным (если вы не храните в нем данные изображения или тому подобное). - person Brad Larson; 21.05.2009
comment
Вы можете использовать структуру C для данных и избежать всех проблем с выделением/сохранением/выпуском NSObject. - person Remus Rusanu; 22.05.2009