Инициализация переменной экземпляра Objective C в методе - PullRequest
1 голос
/ 28 июня 2011

Кто-нибудь получил эту проблему? Если мне нужна переменная экземпляра, а не свойство, и инициализировать эту переменную в методе, то когда она мне понадобится, она уже освобождается. Это происходит для авто-выпущенных объектов. В чем причина этого?

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

MyClass.h

@interface MyClass:UIViewController {
  NSDate * date;
}

MyClass.m

@implementation MyClass {

- (void) anInit {
  date = [NSDate date];
}

- (void) useDate {
  NSLog (@"%@", date); 
// here date is already release, and get bad access.
}

}

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Вам нужно retain Дата.

Автоматически освобожденный объект будет освобожден при следующем сливе пула автоматического выпуска. Когда это происходит, это никак не связано с жизненным циклом вашего объекта.

Ваша реализация должна выглядеть так:

@implementation MyClass {

    - (void) anInit {
      date = [[NSDate date] retain];  // or [[NSDate alloc] init]
    }

    - (void) useDate {
      NSLog (@"%@", date); 
    }

    - (void) dealloc {
        [date release];
        [super dealloc];
    }

}
2 голосов
/ 28 июня 2011

[NSDate date] - это Convenience Constructor , который автоматически высвобождается, вам нужно добавить удерживающий вызов. Также убедитесь, что anInit вызывается только один раз, иначе вы создадите утечку памяти, не вызвав сначала [date release].

- (void) anInit {
  date = [[NSDate date] retain];
}
...