Я должен приложить создание / выпуск объекта с помощью try / finally? - PullRequest
0 голосов
/ 13 января 2009

В Delphi это нормально:

ob = TObject.create;
try
  //code
finally
  ob.free;
end;

Интересно, похоже ли это в Obj-c.

Ответы [ 4 ]

3 голосов
/ 14 января 2009

Вы могли бы сделать это таким образом, но исключения имеют высокую стоимость в Objective-C. Существуют некоторые различия в их производительности между 32-разрядными и 64-разрядными интерфейсами ABI, а также между исключениями Objective-C и C ++.

Альтернативой является создание ваших объектов так, чтобы они автоматически высвобождались, и сохраняли их только до завершения вашего метода.

SomeClass *object = [[[SomeClass alloc] init] autorelease];

/* deadly code here */

return [object retain];

Таким образом, даже если в вашем коде возникнет исключение, ваш объект будет освобожден при следующем сливе пула автоматического выпуска (обычно в конце цикла событий), при условии, что исключение не является фатальным и вызывает сбой вашей программы.

У Apple есть документация об исключениях Obj-C и примечания к выпуску для Leopard ближе к концу обсуждаются изменения в 64-битном ABI.

1 голос
/ 27 ноября 2011

хороших ответов, однако ... Я должен быть исправлен, но, насколько я понимаю, @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); 
}
1 голос
/ 13 января 2009

Я, конечно, не эксперт в Obj-C, но тот факт, что он предоставляет (то, что люди спрашивали в Delphi) соединение try / catch / finally, дает вам возможность использовать его для программирования, как в Delphi: 1001 *

@try {
   // protected block
} 
@catch (id theException) {
  // do smthing with theException
} 
@finally {
  // clean up code 
}

И я бы сказал, что если бы программисты использовали @finally чаще, в их разработке было бы меньше ошибок.

1 голос
/ 13 января 2009

Нет. Objective-C поддерживает исключения, и вы видите их в Какао нечасто (NSError - это направление, в котором движется Apple), но вы определенно не будете использовать их каждый раз, когда инициализируете или отпускаете объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...