Как я могу выделить и инициализировать объект, чтобы он не должен перезагружаться снова, когда ViewDidLoad Loads?
Я инициализировал объект делегата в ViewDidLoad
моего ViewController, но когда я снова загружаю его, он снова инициализирует значение.
Я сохраняю какой-то массив в том объекте делегата, к которому я хочу получить доступ, используя getObject
а также setObject
, Что я должен сделать, чтобы объект делегата не переинициализировался каждый раз ViewDidLoad
называется?
4 ответа
Рассматривали ли вы эту стратегию:
- После запуска вашего приложения, до того, как этот конкретный объект будет инициализирован и использован, установите для него значение nil.
- Впервые ваше приложение пытается использовать его, проверьте, все еще ли оно равно нулю (должно быть, так как это в первый раз), затем инициализируйте его и используйте
- Для остальной части жизненного цикла вашего приложения, всякий раз, когда ваше приложение снова запускается в метод viewDidLoad, всегда проверяйте, является ли этот объект нулевым или нет (в этот момент он не должен быть нулевым). Это сэкономит вашему приложению время и усилия при попытке инициализировать объект, который уже был инициализирован.
Однако, когда вы используете эту стратегию, вы должны знать, что значение этого конкретного объекта должно оставаться неизменным на протяжении всего жизненного цикла вашего приложения. Иначе это не сработает.
Вы должны инициализировать только элементы пользовательского интерфейса в viewDidLoad. Все остальное должно быть инициализировано в конструкторе (initWith...)
Как все говорят, вам, вероятно, нужен одноэлементный объект. Самый простой способ сделать это так:
// interface
@interface MyViewController
{ ... }
+(DelegateType*) theDelegate;
...
@end
// implementation
@implementation MyViewController
+(DelegateType*) theDelegate
{
static DelegateType* theDelegate = nil;
if (theDelegate == nil)
{
theDelegate = [[DelegateType alloc] init];
}
return theDelegate;
}
@end
// To use it
[foo setDelegate: [MyViewController theDelegate]];
Если вы хотите где-нибудь, чтобы все делалось только один раз, это обычно где-то в Синглтоне - объект, который создается один раз и на который ссылаются со всех концов.
AppDelegate - это синглтон по умолчанию, который вы получаете бесплатно. Но если через некоторое время вы решите, что в AppDelegate будет слишком много, будет хорошей идеей создавать различные объекты Singleton, в которые вы помещаете пользовательские данные.
Есть много примеров, показывающих, как сделать синглтон, теперь, когда вы знаете термин, который вы ищете.