Objective-C схожий с C# оператор?
В C# я могу написать оператор использования, такой как:
using (SqlConnection connection = new SqlConnection("connectionString"))
{
...
}
Это гарантирует, что объект подключения будет удален после того, как он вышел из области видимости. Мне интересно, есть ли способ сделать это в рамках цели c. У меня в основном есть пул соединений, который поддерживает несколько открытых сокетов, вместо того, чтобы открывать и закрывать соединение каждый раз, когда я его использую, я могу окунуться в свой пул соединений, получить открытое соединение (или создать новое, если требуется), затем освободить соединение обратно в пул, как только я закончу с ним. Мой код объективного c в настоящее время выглядит примерно так:
MyConnection * connection = [ConnectionPool ConnectionWithDetails: @"host/server/port/etc"];
[connection doSomething];
[ConnectionPool ReleaseConnection: connection];
Так что если по какой-то причине, ReleaseConnection
не вызывается, соединение просто болтается (со временем оно будет освобождено, но оно не вернется в мой пул).
По сути, я ищу способ, которым я могу устранить требование для вызова ReleaseConnection
, Я проводил некоторые исследования, но до сих пор я пришел в себя.
3 ответа
Конечно, вы можете использовать @try
-@catch
-@finally
блок, с @catch
опущено.
MyConnection * connection = [ConnectionPool ConnectionWithDetails: @"host/server/port/etc"];
@try {
[connection doSomething];
}
@finally {
[ConnectionPool ReleaseConnection: connection];
}
Независимо от того, как вы выходите из @try
блок, @finally
блок будет работать.
Вы можете рассмотреть возможность использования блоков, поэтому вместо создания соединения и его использования вы вместо этого отправляете блок в пул соединений. Пул запускает блок в соответствующее время и передает все необходимые параметры (соединение). Когда блок завершается, пул может очистить по мере необходимости.
Хорошо, если вы создаете метод doSomething, вы можете работать в вызове [ConnectionPool ReleaseConnection: connection] либо в своем определении метода doSomething, либо вы можете предоставить дополнительный блок завершения, который делает этот вызов для вас.