Я удивлен, что твой код не падает.-drain
ведет себя так же, как и -release
в среде с подсчетом ссылок, поэтому следующее перезагружает пул
slidePool = [[NSAutoreleasePool alloc] init]; // this is in the wrong place
for(NSDictionary *slide in slides){
Slide *thisSlide = [[Slide alloc] initWithEntity:[NSEntityDescription entityForName:@"Slide" inManagedObjectContext:self.managedOC] insertIntoManagedObjectContext: self.managedOC];
thisSlide.path = prj.path;
[thisSlide saveFile:[slide objectForKey:@"file"]];
[prj addSlidesObject:thisSlide];
[thisSlide release];
[slidePool drain];
}
Если только в коллекции slides
нет только одного объекта.Вам нужно это:
for(NSDictionary *slide in slides){
slidePool = [[NSAutoreleasePool alloc] init]; // this is in the right place
Slide *thisSlide = [[Slide alloc] initWithEntity:[NSEntityDescription entityForName:@"Slide" inManagedObjectContext:self.managedOC] insertIntoManagedObjectContext: self.managedOC];
thisSlide.path = prj.path;
[thisSlide saveFile:[slide objectForKey:@"file"]];
[prj addSlidesObject:thisSlide];
[thisSlide release];
[slidePool drain];
}
Кроме этого, у вас есть правильная общая идея.
Вы должны истощить свой самый внешний пул в блоке finally вашего обработчика исключений, чтобы он не пропускался при возникновении исключения, т.е. вы должны сделать это:
- (void)main{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // first pool
@try {
// Do al your stuff
}
@catch (NSException * e) {
}
@finally
{
[pool drain];
}
}