NSMutableArray破坏

时间:2008-10-07 18:05:05

标签: objective-c cocoa

我有一个带有快乐对象的数组NSMutableArray。每当我尝试清除所有对象的数组并重新填充它时,这些对象就会恶意地打开(泄漏)。

它在init函数中分配如此

self.list = [NSMutableArray array];

我用来清除它的不同方法包括:

self.list = nil;
self.list = [NSMutableArray array];

[self.eventList removeAllObjects];

显式分配和释放数组也不起作用。只有在我尝试重置列表时才会发生泄漏。

我在重置时错过了一个步骤,或者这是一个不同的问题?

5 个答案:

答案 0 :(得分:9)

您是如何创建泄漏的对象的? 如果你做了这样的事情:

- (void)addObjectsToArray {

    [list addObject:[[MyClass alloc] init];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
}

然后,当释放列表时,您将泄漏两个对象。

您应该用以下代码替换任何此类代码:

- (void)addObjectsToArray {

    MyClass *myObject = [[MyClass alloc] init];
    [list addObject:myObject];
    [myObject release];

    OtherClass *anotherObject = [[OtherClass alloc] init];
    [list addObject:anotherObject];
    [anotherObject release];
}

更详细:

如果您遵循第一个模式,则根据您拥有的Cocoa memory management rules创建了两个对象。放弃所有权是你的责任。如果不这样做,该对象将永远不会被释放,您将看到泄漏。

但是,您没有立即看到泄漏,因为您将对象传递给数组,而数组也拥有它们的所有权。只有从阵列中删除对象或解除分配阵列本身时,才会识别泄漏。当其中任何一个事件发生时,数组放弃对象的所有权,它们将在您的应用程序中保持“实时”状态,但您不会对它们有任何引用。

答案 1 :(得分:6)

你指的是数组泄漏的对象吗?

如何向阵列添加对象?数组将保留它们,因此您需要在将它们添加到阵列后自动释放或释放它们。否则,在释放数组后,对象仍将保留(泄露)。

MyEvent *event = [[MyEvent alloc] initWithEventInfo:info];
[self.eventList addObject:event];
[event release];

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];

答案 2 :(得分:4)

您的@property声明是什么样的?你在合成访问者吗?如果是,则需要@property(retain)。我假设当你说对象正在打开你时,你指的是核心转储(EXC\_BAD\_ACCESS)

答案 3 :(得分:0)

我会说我在这里没有足够的信息来给你一个很好的答案。你是说仍然分配了NSMutableArray,但它是空的并且没有任何对象,但是之前在数组中的对象仍然被分配,即使它们应该在那个时候被释放。应用?

如果是这种情况,那么数组可能是空的,但是你的对象没有处理发送给它们的dealloc消息,在这种情况下,对象仍在内存中,但没有被任何东西引用。

我想帮助你,我想确切地知道MallocDebug确切地说是泄露了什么。另外@Elfred在检查数组的@property方法时给出了一些很好的建议,实际上它应该保留或复制。

答案 4 :(得分:0)

如果只在您尝试重置列表时发生泄漏,则您有其他人使用您刚刚尝试发布的其他对象。