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, либо вы можете предоставить дополнительный блок завершения, который делает этот вызов для вас.

Другие вопросы по тегам