Как вы создали объекты, которые протекают?
Если вы сделали что-то вроде этого:
- (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];
}
Более подробно:
Если вы следуете первому шаблону, вы создали два объекта, которые, согласно вашим правилам управления памятью какао , принадлежат вам. Это ваша обязанность отказаться от собственности. Если вы этого не сделаете, объект никогда не будет освобожден, и вы увидите утечку.
Однако вы не сразу видите утечку, потому что вы передаете объекты в массив, который также становится их владельцем. Утечка будет распознаваться только при удалении объектов из массива или при освобождении самого массива. Когда происходит любое из этих событий, массив отказывается от владения объектами, и они остаются «живыми» в вашем приложении, но у вас не будет ссылок на них.