Question

En C #, je peux écrire une déclaration d'utilisation telle que:

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

Cela garantit que l'objet de connexion est éliminé une fois qu'il est sorti de la portée. Je me demande s'il existe un moyen de le faire dans OBJECTIF-C. J'ai essentiellement un pool de connexion qui garde plusieurs sockets ouverts, plutôt que d'avoir besoin d'ouvrir et de fermer une connexion chaque fois que je l'utilise, je peux plonger dans mon pool de connexion, prendre une connexion ouverte (ou en créer une nouvelle si nécessaire), puis relâchez la connexion dans la piscine une fois que j'en aurai fini. Mon code objectif-C ressemble actuellement à ceci:

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

Donc, si pour une raison quelconque, ReleaseConnection Ne s'appelle pas, la connexion est tout simplement suspendue (elle sera finalement libérée, mais elle ne revient pas dans ma piscine).

Fondamentalement, je cherche un moyen de pouvoir éliminer l'exigence d'appel ReleaseConnection. J'ai fait des recherches, mais jusqu'à présent, je suis venu sec.

Était-ce utile?

La solution

Bien sûr, vous pouvez utiliser un @try-@catch-@finally bloc, avec le @catch omis.

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

Peu importe comment vous quittez le @try bloc, le @finally Le bloc fonctionnera.

Autres conseils

Vous pouvez envisager d'utiliser des blocs, donc au lieu de créer une connexion et de l'utiliser, vous soumettez à la place un bloc au pool de connexion. Le pool exécute le bloc au moment approprié et transmet tous les paramètres requis (la connexion). Lorsque le bloc termine, la piscine peut nettoyer au besoin.

Eh bien, si vous créez la méthode de dosage, vous pourriez travailler dans l'appel à la [connexion ConnectionPool Releaseconnection: Connexion] Soit dans votre définition de la méthode de dosage, soit vous pourriez fournir un bloc d'achèvement facultatif qui vous appelle cet appel

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top