Как спроектировать статический класс? - PullRequest
1 голос
/ 11 марта 2009

Я хочу создать специальный класс для хранения множества значений, таких как strName, strNo, intPassword ..., чтобы несколько других классов могли изменять это значение в этом классе. Я хочу использовать точечный синтаксис для вызова его свойств, таких как

Values.strName = ...; 
Я не хочу инициализировать класс каждый раз, когда я читаю / записываю его значения, потому что некоторые из его значений все еще используются.

Я называю класс «Значения» и проектирую его, используя следующий код:

@interface Values : NSObject {
    IBOutlet NSString *strName;
}
@property (nonatomic, copy) NSString *strName;
@end

Я импортирую «Values.h» в другой класс и вызываю свойство, используя


Values.strName = @"Name";

Я не создаю объект «Значения», чтобы избежать перезаписи данных. Появляется ошибка, говорящая, что «синтаксическая ошибка раньше. лексема». Любые другие способы создать класс, хранящий глобальные переменные, но не должны быть инициализированы при использовании этих данных?

Ответы [ 3 ]

4 голосов
/ 11 марта 2009

Другое решение этой проблемы - добавить переменные (или классы) в объект AppDelegate. AppDelegate легко превратиться в пустяк, но если эти переменные действительно являются собственностью вашего приложения, это подходящее место для них.

Вы всегда можете получить ссылку на свой AppDelegate, используя [UIApplication sharedApplication].delegate (вам может потребоваться разыграть это)

3 голосов
/ 11 марта 2009

Я хочу создать специальный класс для хранения множества значений, таких как strName, strNo, intPassword ...

Почему? Нет ничего плохого в том, чтобы помещать неизменяемые и примитивные объекты в глобальные переменные только для чтения:

NSString *const strName = @"Name";
const NSInteger intPassword = 0xDEADBEEF;

Если вы хотите добавить к ним префиксы как глобальные, «g» (как в gStrName и т. Д.) Встречается часто и работает нормально.

Вы можете испытать искушение сказать «но глобалы - это зло!», Но подумайте о том, что вы говорите: почему глобалы злые?

  • Потому что другой код может изменять объекты. (Не так с неизменными объектами.)
  • Потому что другой код может заменить объекты. (Не так с переменными только для чтения (const).)
  • Потому что два куска кода могут использовать один и тот же объект. (Не проблема, если объект является базовым, например, строка или целое число.)

Пока ни одна из этих жалоб не применима, в глобальных переменных нет ничего плохого. Они довольно распространены в Какао (например, большинство его строковых констант на самом деле являются глобальными переменными).

2 голосов
/ 11 марта 2009

Если вы используете шаблон синглтона, то вы можете достичь чего-то близкого к этому. Использование помощника ' SynthesizeSingleton.h ' Мэтта Галлахера:

// Values.h
#import "SynthesizeSingleton.h"

@interface Values : NSObject {
  ...
}

// props

+ (Values *)sharedValues;
@end

// Values.m
@implementation Values

SYNTHESIZE_SINGLETON(Values);

@synthesize props;

@end

Затем, чтобы использовать ваш синглтон:

NSString *myVal = [[Values sharedValues] someValue];

или

Values *v = [Values sharedValues];

NSString *myVal = v.someValue;

...