Objective-C, аналогичный оператору на C# с использованием?

StackOverflow https://stackoverflow.com/questions/19848658

  •  29-07-2022
  •  | 
  •  

Вопрос

В C# я могу написать оператор, например:

using (SqlConnection connection = new SqlConnection("connectionString"))
{
    ...
}

Это гарантирует, что объект подключения утилизируется, как только он вышел из строя. Мне интересно, есть ли способ сделать это в Objective-C. У меня в основном есть пул соединений, который удерживает несколько гнезда открытыми, вместо того, чтобы открывать и закрывать соединение каждый раз, когда я использую его, я могу окунуться в свой пул соединений, взять открытое соединение (или создавать новое, если это необходимо), тогда Отпустите соединение обратно в бассейн, как только я закончу с ним. Мой код объективного C в настоящее время выглядит примерно так:

MyConnection * connection = [ConnectionPool ConnectionWithDetails: @"host/server/port/etc"];
[connection doSomething];
[ConnectionPool ReleaseConnection: connection];

Итак, если по какой -то причине, ReleaseConnection Не вызывается, соединение просто свисает (в конечном итоге оно будет освобождено, но оно не вернется в мой бассейн).

По сути, я ищу способ, чтобы устранить требование для вызова ReleaseConnection. Анкет Я проводил некоторые исследования, но до сих пор я высыхал.

Это было полезно?

Решение

Конечно, вы можете использовать @try-@catch-@finally Блок, с @catch опущен.

MyConnection * connection = [ConnectionPool ConnectionWithDetails: @"host/server/port/etc"];
@try {
    [connection doSomething];
}
@finally {
    [ConnectionPool ReleaseConnection: connection];
}

Независимо от того, как вы выходите из @try Блок, @finally Блок будет работать.

Другие советы

Вы можете рассмотреть возможность использования блоков, поэтому вместо создания соединения и его использования вы вместо этого отправили блок в пул соединений. Пул запускает блок в соответствующее время и передает любые необходимые параметры (соединение). Когда блок завершает, бассейн может очистить по мере необходимости.

Ну, если вы создаете то, что вы можете работать в вызове с помощью [ConnectionPool ReleaseConnection: Connection] либо в вашем определении метода Dosomething, либо вы можете предоставить дополнительный блок завершения, который делает этот вызов для вас

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top