хороших ответов, однако ...
Я должен быть исправлен, но, насколько я понимаю, @try {} @finally {} отличается по концепции и, следовательно, применяется к @try {} @ catch {} @finally {}, в том случае, если Вы не генерируете никаких исключений, есть минимальные накладные расходы, однако, когда возникают исключения (которые должны быть по определению «исключение, а не правило»), они служат для защиты переносимого ресурса, оставляя обработчик @catch еще выше Пищевая цепочка, чтобы иметь дело с логической стороной работы с исключением.
в качестве примера, вот конструкция, которую я часто использую, когда мне приходится возвращать автоматически выпущенное значение, которое автоматически высвобождает много посторонних данных в пул вызывающих программ, если бы не было @ try / @ finally / dump / autorelease построить вы видите здесь.
+(NSArray *) arrayOfUrlPrefixAssociatedUrlArraysFromUnsortedArrayOfUrlStrings:(NSArray *)urlStrings {
NSArray *arrayResult = nil;
NSAutoreleasePool *wader = [[NSAutoreleasePool alloc] init];
@try {
NSMutableDictionary *result = [NSMutableDictionary dictionary];
for (NSString *urlString in urlStrings) {
BOOL addedToPrior = NO;
for (NSString *prefix in result.allKeys) {
if ([urlString hasPrefix:prefix]) {
[(NSMutableArray *) [result objectForKey:prefix] addObject:urlString];
addedToPrior = YES;
break;
}
}
if (!addedToPrior) {
[result setObject:[NSMutableArray arrayWithObject:urlString] forKey:[self urlPrefixFromUrlString:urlString]];
}
}
arrayResult = [[NSArray alloc] initWithArray:[result allValues]];
}
@finally {
[wader drain];
}
return (arrayResult?[arrayResult autorelease]:nil);
}