在iPhone应用程序中管理经常重新分配给新分配的内存的实例变量的正确方法是什么?

时间:2010-02-10 04:54:43

标签: iphone objective-c memory-management autorelease retain

我无法弄清楚如何管理一个实例变量的内存,该变量需要在一段时间内保持当前状态,然后重新分配给新分配的内存。

以下示例为实例变量“importantData”。:

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


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

在我的实际项目中,getObject过程是在一个不同的类中,但我简化它只是为了得到我的观点。 importantData必须在两次调用Update之间保持有效。

每次调用getObject时,我都会分配新内存并将其分配给importantData,对吗?我想我必须释放importantData指向的内存,对吧?我不确定如何在不泄漏内存或尝试引用释放内存的情况下正确执行此操作。谢谢!

2 个答案:

答案 0 :(得分:2)

您只需要更新,如下所示:

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

基本上,只需记住在分配新值之前发布。

答案 1 :(得分:1)

您可以使用静态变量。

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从其他类中获取它。