将自动释放的对象添加到NSMutableArray

时间:2011-02-02 21:55:54

标签: objective-c ios4 nsmutablearray autorelease

这是由于我正在做的一些内存管理而抛出异常的一些代码:

我的页眉文件:

@property(nonatomic, retain) NSMutableArray *holderArray;

我的实施文件:

@synthesize holderArray

-(void) viewDidLoad{
    holderArray = [[NSMutableArray alloc] init];
    [self addSampleObject];
}

-(void) addSampleObject{
    [holderArray addObject:[self createSampleObject]];
}

-(ModelObject *) createSampleObject{
    ModelObject *mObj = [[ModelObject alloc] init];
    // Set a few properties
    return [mObj autorelease];
}

在这种情况下应该发生什么? createSampleObject在某个时刻自动释放对象,而[holderArray addObject]将该对象的引用计数增加1.根据我的理解,它应该都是好的。

但是当getter访问该元素时,我得到以下异常。如果我在创建模型对象时删除autorelease stmt,它就会消失 -

#0  0x012525a8 in objc_exception_throw ()
#1  0x010f36e5 in -[__NSArrayM objectAtIndex:] ()

我是否遗漏了关于autorelease如何运作的基本信息?

谢谢,
的Teja。

编辑:其实你是对的,我的代码中有一个完全不相关的部分就是抛出这个错误。我认为我从工作中改变的唯一一件事就是添加autorelease语句。

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为你的错误可能在getter中 - 看起来更像是一个超出范围的索引而不是内存管理问题。

您对内存管理的理解似乎是正确的,我唯一要注意的是在方法中使用“create”一词表明返回的对象不是自动释放的。不确定你的实际方法名称是什么样的,我知道这只是示例代码。

答案 1 :(得分:1)

保证自动释放的对象在自动释放的函数结束之前保持可访问状态。请考虑以下代码:

-(ModelObject *) createSampleObject{
  ModelObject *mObj = [[ModelObject alloc] init];
  //Set a few properties
  return [mObj autorelease];
}

您可以使用相同的结果完成此操作:

-(ModelObject *) createSampleObject{
  ModelObject *mObj = [[[ModelObject alloc] init] autorelease];
  // Set a few properties
  return mObj;
}

我没有足够的代码告诉您确切的错误,但我建议您跟踪堆栈跟踪,直到您看到您编写的您的代码。调试器可能会突出显示确切问题的行。