2011-02-07 3 views
0

Я инициализировал объект-делегат в ViewDidLoad моего ViewController, но когда я снова загружаю его, он снова инициализирует значение.Как я могу выделить и инициализировать объект, чтобы он не перезагружался снова при загрузке ViewDidLoad?

Я сохраняю какой-то массив в этом делетете, который я хочу получить, используя getObject и setObject. Что я должен делать, чтобы объект делегата не получал повторной инициализации каждый раз, когда вызывается ViewDidLoad?

ответ

1

Вы рассматривали эту стратегию:

  • После того как приложение запускается, до того, что конкретный объект инициализируется и используется, установите его в ноль.
  • В первый раз, когда ваше приложение пытается использовать его, проверьте, все ли оно по-прежнему (оно должно быть с первого раза), затем инициализируйте его и используйте его
  • Для остальной части жизненного цикла вашего приложения, когда ваш приложение снова запускается в метод viewDidLoad, всегда проверяйте, равен ли этот объект нулю или нет (он не должен быть nil в этой точке). Это позволит вашему приложению время и усилия, пытающиеся инициализировать объект, который уже был инициализирован.

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

+0

Мне понравился - (void) viewDidLoad { [super viewDidLoad]; \t if (myRunningObject == nil) { \t NSLog (@ "If execute"); \t \t myRunningObject = [[ResAppDelegate alloc] init]; \t}, но все же это не работает, еще одна вещь, которую я хотел бы упомянуть, что я делаю что-то вроде - (void) setObjectforNew: (ResAppDelegate *) myRunningObject { \t NSLog (@ "setObjectForNow"); \t self.myRunningObjectNew = myRunningObject; }, а затем отправляя массив usring нового объекта, который находится в другом классе, я делаю это правильно? –

0

Вы должны инициализировать только элементы интерфейса в viewDidLoad. Все остальное должно быть inited в конструкторе (initWith ...)

+0

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

+0

Если вы хотите, чтобы какой-либо массив/данные/объект и т. Д. Был доступен из любого места в вашем приложении, лучший способ сделать это - создать одноэлементный, который сохранит все необходимые данные. – Max

+0

Что такое singleton Sir, я не слышал этого термина раньше, просто дайте мне подсказку –

0

Если вы хотите, чтобы что-то было сделано только один раз, это, как правило, в Синглтоне где-то - объект, который делается один раз и ссылается со всего.

AppDelegate - это синглтон по умолчанию, который вы получаете бесплатно. Но если вы решите, что через некоторое время в AppDelegate появится слишком много, неплохо создать разные объекты Singleton, в которые вы помещаете пользовательские данные.

Существует много примеров, показывающих, как сделать Singleton, теперь, когда вы знаете термин, который вы ищете.

0

Как все говорят, вам, вероятно, нужен одноэлементный объект. Самый простой способ сделать это так:

// 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]];