我有一个NSMutableArray
快乐对象的数组.每当我尝试清除所有对象的数组并重新填充它时,这些对象就会恶意地打开(泄漏)我.
它是在init函数中分配的
self.list = [NSMutableArray array];
我用来清除它的不同方法包括:
self.list = nil; self.list = [NSMutableArray array];
和
[self.eventList removeAllObjects];
显式分配和释放数组也不起作用.只有在我尝试重置列表时才会发生泄漏.
我在重置时错过了一个步骤,或者这是一个不同的问题?
你是如何创建泄漏的对象的?如果你做了这样的事情:
- (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内存管理规则创建了两个对象.放弃所有权是你的责任.如果不这样做,该对象将永远不会被释放,您将看到泄漏.
但是,您没有立即看到泄漏,因为您将对象传递给数组,而数组也拥有它们的所有权.只有从阵列中删除对象或解除分配阵列本身时,才会识别泄漏.当其中任何一个事件发生时,数组将放弃对象的所有权,并且它们将在您的应用程序中保持"实时",但您将不会对它们进行任何引用.
你指的是数组泄漏的对象吗?
你是如何向数组添加对象的?数组将保留它们,因此您需要在将它们添加到阵列后自动释放或释放它们.否则在释放数组后,对象仍将保留(泄露).
MyEvent *event = [[MyEvent alloc] initWithEventInfo:info]; [self.eventList addObject:event]; [event release]; MyEvent *otherEvent = [[[MyEvent alloc] initWithEventInfo:otherInfo] autorelease]; [self.eventList addObject:otherEvent];