Как правильно управлять памятью в приложении iPhone для переменной экземпляра, которая часто переназначается вновь выделенной памяти? - PullRequest
0 голосов
/ 10 февраля 2010

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

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

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


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

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

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

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

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

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

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

1 голос
/ 10 февраля 2010

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

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 метода класса.

...