防止多次分配同一个数组

时间:2011-05-25 19:52:24

标签: iphone objective-c cocoa-touch memory-management

初学者的问题:我有一个将数据放入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;  在我的标题

4 个答案:

答案 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。

编辑:正如@bbum所提到的,你必须使用点符号。 self.indexContent = <whatever>;我很难忽视这一点。