防止多次分配同一数组

问题描述

| 初学者的问题:我有一个将数据放入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>;
我不好看这个。