2011-06-26 1 views
0

J'ai utilisé libmysqlclient. Voici mes déclarations:règles de gestion de la mémoire pour assigner la propriété

MYSQL *sql; 
MYSQL *sqlPut; 
MYSQL_RES *qResult; 


@property(assign) MYSQL *sql; 
@property(assign) MYSQL *sqlPut; 
@property(assign) MYSQL_RES *qResult; 

Voici le code où je: attribuer des propriétés

 MYSQL *newSql = mysql_init(NULL); 
     if (newSql == NULL) NSLog(@"MYSQL: Failed to initate connection"); 
     my_bool reconnect = 1; 
     mysql_options(newSql, MYSQL_OPT_RECONNECT, &reconnect); 
     NSInteger connectionTimeout = 300; 
     mysql_options(newSql, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&connectionTimeout); 
     mysql_options(newSql, MYSQL_OPT_WRITE_TIMEOUT, (const void *)&connectionTimeout); 
     mysql_options(newSql, MYSQL_OPT_READ_TIMEOUT, (const void *)&connectionTimeout); 

     //mysql_options(newSql, CLIENT_INTERACTIVE, &reconnect); 

     NSNumberFormatter *portTransfer = [[NSNumberFormatter alloc] init]; 

     newSql = mysql_real_connect(newSql, [[connection valueForKey:@"ip"] UTF8String] , [[connection valueForKey:@"login"] UTF8String], [[connection valueForKey:@"password"] UTF8String], [[connection valueForKey:@"database"] UTF8String], [[portTransfer numberFromString:[connection valueForKey:@"port"]] unsignedIntValue], NULL, 0); 
     if (newSql == NULL) { NSLog(@"MYSQL: Failed to connect database with error:%s\n for connection:%@",mysql_error(newSql),connection); return NO ;} 
     //else NSLog(@"MYSQL: Carrier:%@ connect database DONE",carrierName); 
     if ([[connection valueForKey:@"selectionDirections"] intValue] == 0) if (!self.sql) self.sql = newSql; else mysql_ping(self.sql); 
     else { 
      //NSInteger connectionTimeout = 10; 
      //mysql_options(newSql, MYSQL_OPT_CONNECT_TIMEOUT, (const void *)&connectionTimeout); 
      //self.sqlPut = newSql; 
      if (!self.sqlPut) self.sqlPut = newSql; else mysql_ping(self.sqlPut); 
     } 
     [portTransfer release]; 

Quelle est la bonne façon de nettoyer cette propriété? J'ai des fuites que je ne trouve pas dans mon code, donc je pense qu'il pourrait y avoir des fuites dans cette partie du code. Actuellement, je fais:

self.sql = nil; 
self.sqlPut = nil; 
self.qResult = nil; 
+0

Vous n'avez jamais besoin de libérer des propriétés avec la directive 'assign', seules les propriétés avec les directives' copy' et 'retain' doivent être libérées. –

+0

Etes-vous sûr que la fuite est provoquée par cet extrait de code? – lbrndnr

+0

non, je ne suis pas sûr, mais actuellement je vérifiais tout, mais l'application est toujours en croissance jusqu'à ce que la synchronisation se passe – Alex

Répondre

0

mysql_init nouvel objet qui elle partage entre est libéré lorsque vous fermez la connexion. Vous devrez nettoyer la mémoire au cas où votre flux de code n'irait pas à l'endroit où vous fermez la connexion.

Donc je dirais que j'appelle mysql_close une fois que vous avez fini d'utiliser la poignée de connexion.