这是由于我正在做的一些内存管理而抛出异常的一些代码:
我的页眉文件:
@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
语句。
谢谢!
答案 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;
}
我没有足够的代码告诉您确切的错误,但我建议您跟踪堆栈跟踪,直到您看到您编写的您的代码。调试器可能会突出显示确切问题的行。