Накладные расходы настолько малы, что не имеют значения вообще. Остальное - это вопрос дизайна и баланса. «Правильный» способ решения этой проблемы с точки зрения проектирования - сделать зависимость от пользовательских настроек по умолчанию видимой, открыв выход в интерфейсе класса:
@interface ClassThatUsesSomethingFromDefaults : NSObject {
NSUserDefaults *prefs;
}
@property(retain) NSUserDefaults *prefs;
Таким образом, ясно, что поведение этого класса меняется в зависимости от настроек пользователя по умолчанию, что хорошо. Это также упрощает работу со значениями по умолчанию в классе (вызов prefs
вместо [NSUserDefaults standardUserDefaults]
). И это облегчает изоляцию класса от остальной системы - вы можете использовать класс без значений по умолчанию, предоставить объект-заглушку по умолчанию или что-то в этом роде.
Недостатком этого решения является то, что вам нужно переосмыслить способ соединения объектов. Что действительно является преимуществом. Такие зависимости, как prefs
, должны быть предоставлены вашему объекту «из внешнего мира», как, например, из Interface Builder или какого-то фабричного класса. (Как я уже говорил в начале, это вопрос баланса. Если у вас есть только одна строка предпочтений, вероятно, не стоит создавать все это, чтобы получить единственную строку.)
Синглтоны - это способ дьявола решить эту проблему - прочитайте Синглтоны - это патологические лжецы сообщение в блоге Мишко Хевери и сообщения в блогах, ссылки на которые есть оттуда.