Как правильно управлять памятью в приложении 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.