初学者的问题:我有一个将数据放入MutableArray的方法。潜在地,这个方法可以不止一次被调用,我有点担心它会泄漏内存,因为我每次调用它时都会分配数组:
indexContent = [[NSMutableArray alloc] init];
int numberOfEntries = [noteBookContent count]/3;
for (int k=0; k < numberOfEntries; k++) {
IndexItem *newItem = [[IndexItem alloc] init];
newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
newItem.itemPage = k;
if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
[indexContent addObject:newItem];
}
[newItem release];
}
如果indexContent = [[NSMutableArray alloc] init];
被多次调用,会发生什么?如果不好,我该如何防止这种情况?我应该在viewDidLoad中调用它吗?但是,如果我尝试做“延迟加载”,即如果我确实需要它,只会分配indexContent,我该怎么办呢?有没有办法检查它是否已被分配?
如果所有这一切都很明显,我很抱歉,但我正在努力解决这个问题。也许这是一个我尚未完全掌握的基本概念。谢谢!
编辑:
我有
@property(nonatomic,retain)NSMutableArray * indexContent; 在我的标题
答案 0 :(得分:2)
if (indexContent == nil) indexContent = [NSMutableArray new]; // i screwed up logic first time. derp.
确保释放indexContent
时将其设置为nil;
[indexContent release];
indexContent = nil;
(除非它是dealloc
方法,但可能仍然是个好主意)
请注意,这假设您要重新使用并可能进一步填充现有阵列。如果没有,你可以removeAllObjects
或者你可以释放现有的并重新创建。
或者,如果是@property,您可以:
self.indexContent = [NSMutableArray array]; // not +new!!
或者,用那种方法:
[indexContent release];
indexContent = [NSMutableArray new];
答案 1 :(得分:2)
如果你更多地调用你的函数,那么一旦你因为你没有从previouse调用中释放已分配的内存而泄漏内存。简单检查就像这样:
if(indexContent)
[indexContent release]
从apple中读取内存管理文档会对你有所帮助。
答案 2 :(得分:1)
检查nil的环绕代码,如果是nil则分配数组
//check if it has been allocated
if(indexContent == nil)
{
indexContent = [[NSMutableArray alloc] init];
int numberOfEntries = [noteBookContent count]/3;
for (int k=0; k < numberOfEntries; k++) {
IndexItem *newItem = [[IndexItem alloc] init];
newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
newItem.itemPage = k;
if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
[indexContent addObject:newItem];
}
[newItem release];
}
}
答案 3 :(得分:0)
这取决于。 indexContent是否声明为retain @property?如果是这样,运行时将负责释放先前的数组。如果没有,并且你没有明确释放它,那么是的,它会泄漏。
您还应该确保在dealloc
方法中发布indexContext。
self.indexContent = <whatever>;
我很难忽视这一点。