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

Posted

技术标签:

【中文标题】将自动释放的对象添加到 NSMutableArray【英文标题】:Adding an autoreleased object to NSMutableArray 【发布时间】:2011-02-02 21:55:54 【问题描述】:

下面是一些由于我正在做的一些内存管理而引发异常的代码:

我的头文件:

@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 访问那个元素时,我得到了以下异常。如果我在创建模型对象时删除自动释放 stmt,它就会消失 -

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

我是否遗漏了有关自动释放工作原理的一些基本知识?

谢谢, 泰迦。

编辑:实际上你是对的,我的代码中有一段完全不相关的代码引发了这个错误。我想我唯一改变的就是添加了autorelease 语句。

谢谢!

【问题讨论】:

【参考方案1】:

我认为您的错误可能出在 getter 中 - 这看起来更像是索引越界问题,而不是内存管理问题。

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

【讨论】:

【参考方案2】:

保证自动释放的对象在它们被自动释放的函数结束之前都可以访问。考虑以下代码:

-(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;

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

【讨论】:

以上是关于将自动释放的对象添加到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

ios自动释放池

iOS中的所有对象都会自动添加到自动释放池中吗?

检测到自动释放对象

释放自动释放字符串对象不会崩溃

简述内存管理

在 Objective-C 中如何处理 Autorelease 池中的对象?