Как правильно управлять памятью в приложении iPhone для переменной экземпляра, которая часто переназначается вновь выделенной памяти?

У меня возникают проблемы с выяснением того, как управлять памятью для переменной экземпляра, которая должна поддерживать свое текущее состояние в течение определенного периода времени, а затем переназначаться на вновь выделенную память.

Возьмите следующий пример для переменной экземпляра "ImportantData".

-(void)Update
{
   importantData = [[self getObject] retain];
}


- (SomeObject *)getObject 
{
   SomeObject *objInstance = [[SomeObject alloc] init];
   [objInstance autorelease];  
   return objInstance;
}       

В моем реальном проекте процедура getObject относится к другому классу, но я упростил ее, чтобы донести свою мысль. Важно, чтобы важные данные оставались в силе между вызовами Обновления.

Каждый раз, когда вызывается getObject, я выделяю новую память и присваиваю ее важные данные, верно? Я полагаю, что мне нужно освободить память, на которую важные данные ранее указывали, верно? Я не уверен, как сделать это правильно без утечки памяти или попыток сослаться на освобожденную память. Спасибо!

2 ответа

Решение

Вам просто нужно обновить, чтобы выглядеть так:

-(void)Update
{
   [importantData release];
   importantData = [[self getObject] retain];
}

В основном, просто не забудьте отпустить, прежде чем назначить новое значение.

Вы можете использовать статическую переменную.

static SomeObject *importantObject = nil;

@implementation SomeObject

+ (SomeObject*)getObject {
  if (!importantObject) {
    importantObject = [[SomeObject alloc] init];
  }
  return importantObject;
}

@end

Это будет держать его, пока приложение не существует. Но если вы хотите аннулировать или воссоздать его, вы можете добавить такой метод:

+ (void)expireObject {
  [importantObject release];
  importantObject = nil;
}

Или даже

+ (void)setObject:(SomeObject*)newObject {
  [importantObject release];
  importantObject = [newObject retain];
}

И теперь вы можете использовать importantObject в SomeObjectметоды класса и экземпляра, или получить его из других классов через SomeObjectКлассный метод getter.

Другие вопросы по тегам