0

Débogage de mon implémentation J'ai trouvé un problème de fuite de mémoire. Je sais où est le problème, j'ai essayé de le résoudre mais malheureusement sans succès. Je vais essayer de vous expliquer, peut-être que quelqu'un d'entre vous peut aider avec ça. D'abord j'ai deux classes impliquées dans le problème, la classe de publication (où la publication du service et la configuration de socket est faite) et la connexion (où la liaison de socket et la configuration de flux est faite). Le problème principal est dans la connexion via socket natif. Dans la classe 'publish', le "serveur" accepte une connexion avec un callback. Le rappel a les informations de socket natif. Ensuite, une connexion avec des informations de socket natif est créée. Ensuite, la liaison de socket et la configuration des flux sont terminées. Lorsque ces actions aboutissent, l'instance de la connexion est enregistrée dans un tableau mutable. Ainsi, la connexion est établie.Comment résoudre une connexion désallouée dans iPhone SDK 3.1.3? - Streams - CFSockets

static void AcceptCallback(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) { 
    Publish *rePoint = (Publish *)info; 

    if (type != kCFSocketAcceptCallBack) { 
    return; 
    } 
    CFSocketNativeHandle nativeSocketHandle = *((CFSocketNativeHandle *)data); 
    NSLog(@"The AcceptCallback was called, a connection request arrived to the server"); 
    [rePoint handleNewNativeSocket:nativeSocketHandle]; 
} 
- (void)handleNewNativeSocket:(CFSocketNativeHandle)nativeSocketHandle{ 
Connection *connection = [[[Connection alloc] initWithNativeSocketHandle:nativeSocketHandle] autorelease]; // Create the connection 
if (connection == nil) { 
    close(nativeSocketHandle); 
    return; 
} 
NSLog(@"The connection from the server was created now try to connect"); 
if (! [connection connect]) { 
    [connection close]; 
    return; 
} 

[clients addObject:connection]; //save the connection trying to avoid the deallocation 
} 

L'étape suivante est de recevoir les informations du client, ainsi une fonction de rappel de flux de lecture est déclenchée par l'information de la connexion établie. Mais lorsque le gestionnaire de rappel essaye d'utiliser cette connexion, l'erreur se produit, il est dit qu'une telle connexion est désaffectée. Le problème ici est que je ne sais pas où/quand la connexion est désallouée et comment le savoir. J'utilise le débogueur, mais après quelques essais, je ne vois plus d'infos.

void myReadStreamCallBack (CFReadStreamRef stream, CFStreamEventType eventType, void *info) { 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    Connection *handlerEv = [[(Connection *)info retain] autorelease]; // The error -[Connection retain]: message sent to deallocated instance 0x1f5ef0 (Where 0x1f5ef0 is the reference to the established connection) 
    [handlerEv readStreamHandleEvent:stream andEvent:eventType]; 
[pool drain]; 

} 

void myWriteStreamCallBack (CFWriteStreamRef stream, CFStreamEventType eventType, void *info){ 
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init]; 
    Connection *handlerEv = [[(Connection *)info retain] autorelease]; //Sometimes the error also happens here, I tried without the pool, but it doesn't help neither. 
        [handlerEv writeStreamHandleEvent:eventType]; 
[p drain]; 

} 

Quelque chose d'étrange est que quand je lance le débogueur (avec des points d'arrêt) tout va bien, la connexion n'est pas désallouée et les callbacks fonctionnent très bien et le serveur est capable de recevoir le message. J'apprécierai n'importe quel indice!

Répondre

0

éleminez autorelease de cette ligne:

Connection *handlerEv = [[(Connection *)info retain] autorelease]; 

Maintenant, il semble fonctionner, mais je vais essayer plus de choses, parce que je ne sais pas quand est libéré et si je vais avoir des « effets secondaires "

S'il vous plaît n'importe quel indice est très utile!

Questions connexes