14

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

它像这样在init函数中分配

self.list = [NSMutableArray array];

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

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

[self.eventList removeAllObjects];

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

重置时我错过了一步还是这是一个不同的问题?

4

5 回答 5

8

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

- (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 内存管理规则创建了两个对象。放弃所有权是您的责任。如果你不这样做,对象将永远不会被释放,你会看到一个泄漏。

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

于 2008-10-10T04:13:29.763 回答
6

您是指数组中的对象泄漏吗?

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

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

MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease];
[self.eventList addObject:otherEvent];
于 2008-10-07T19:08:42.907 回答
4

你的@property声明是什么样的?你在合成访问器吗?如果是这样,您需要@property(retain). 我假设当您说对象正在打开您时,您指的是 core dump (EXC\_BAD\_ACCESS)

于 2008-10-07T18:13:04.157 回答
0

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

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

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

于 2008-10-07T19:41:52.153 回答
0

如果仅在您尝试重置列表时发生泄漏,则您有其他人/其他人正在使用您刚刚尝试释放的那些其他对象。

于 2008-10-09T22:05:28.413 回答