将自动释放的对象添加到 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的主要内容,如果未能解决你的问题,请参考以下文章