2011-02-02 60 views
0

下面是一些抛出,因为一些内存管理我正在做的异常代码:添加一个自动释放对象的NSMutableArray

我的头文件:

@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 autoreleases在某个时间点的对象,而[holderArray addObject]递增该对象的引用计数1.从我的理解,它应该都是好的。

但是当一个getter访问那个元素时,我得到以下异常。

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

我失去了一些关于如何自动释放的作品根本 - 创建模型对象时,它就会消失,如果我删除自动释放语句?

谢谢,
Teja。

编辑:其实你是对的,有一个完全不相关的我的代码片抛出这个错误。我认为我从工作中改变的唯一的事情是增加autorelease声明。

谢谢!

回答

2

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

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

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

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

相关问题