如何解决防止多次分配同一数组
| 初学者的问题:我有一个将数据放入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(非原子,保留)NSMutableArray * indexContent;
在我的标题中
解决方法
环绕代码检查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];
}
}
,如果您再调用一次函数,则由于您没有从先前的调用中释放已分配的内存,因此一旦您将泄漏内存。简单的检查是这样的:
if(indexContent)
[indexContent release]
从Apple读取内存管理文档将对您有很大帮助。
,if (indexContent == nil) indexContent = [NSMutableArray new]; // i screwed up logic first time. derp.
确保释放ѭ5时将其设置为nil。
[indexContent release];
indexContent = nil;
(除非是dealloc
方法,但那里可能仍然是一个好主意)
请注意,这是假设您要重复使用并可能进一步填充现有阵列。如果没有,您可以按8键,也可以释放现有的并重新创建。
或者,如果是@property,则可以:
self.indexContent = [NSMutableArray array]; // not +new!!
或者,采用这种方法:
[indexContent release];
indexContent = [NSMutableArray new];
,这取决于。是否将indexContent声明为保留@property?如果是这样,运行时将负责释放先前的数组。如果不是,并且您没有明确释放它,那么是的,它将泄漏。
您还应确保在dealloc
方法中释放indexContext。
编辑:如@bbum所述,您必须使用点表示法。 self.indexContent = <whatever>;
我不好看这个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。