我有一个带有快乐对象的数组NSMutableArray
。每当我尝试清除所有对象的数组并重新填充它时,这些对象就会恶意地打开(泄漏)。
它在init函数中分配如此
self.list = [NSMutableArray array];
我用来清除它的不同方法包括:
self.list = nil;
self.list = [NSMutableArray array];
和
[self.eventList removeAllObjects];
显式分配和释放数组也不起作用。只有在我尝试重置列表时才会发生泄漏。
我在重置时错过了一个步骤,或者这是一个不同的问题?
答案 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)
如果只在您尝试重置列表时发生泄漏,则您有其他人使用您刚刚尝试发布的其他对象。