2009-03-11 5 views
1

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

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

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

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

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


Values.strName = @"Name"; 

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

ответ

4

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

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

+0

Хорошая идея! Это может быть самый простой способ хранения глобальных переменных. Благодарю. –

+0

Другим способом, по крайней мере на Mac, является подкласс NSApplication и размещение там свойств. Я не знаю, можете ли вы сделать это с помощью UIApplication. –

+0

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

2

Если вы используете одноэлементный шаблон, то вы можете достичь чего-то близкого к этому. Использование '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;

3

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

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

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

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

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

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

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

+0

Причина, почему я хочу, чтобы создать этот класс является то, что этот класс используется, чтобы другие классы чтения и записи значений (несколько классов могут изменять одно и то же значение). Я забываю упомянуть: эти значения не const. –

Смежные вопросы