2011-06-26 7 views
0

私はlibmysqlclientを使用しています。ここに私の宣言は、次のとおりです。割り当て管理のメモリ管理ルール

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


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

これは私がプロパティを割り当てるコードです:

 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]; 

クリーンアップへの正しい方法は、このプロパティは何ですか?私は自分のコードで見つけることができない漏れがあるので、コードのこの部分でそれが漏れるかもしれないと思っています。現在私は:

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

'assign'ディレクティブでプロパティを解放する必要はなく、' copy'および 'retain'ディレクティブを持つプロパティだけを解放する必要があります。 –

+0

このコードスニペットによってリークが発生していませんか? – lbrndnr

+0

いいえ、私は分かりませんが、現在私はすべてをチェックしていましたが、同期が完了するまでアプリケーションはまだメモリが増えています – Alex

答えて

0

mysql_init接続を閉じるときに解放される新しいオブジェクトを割り当てます。コードフローが接続を閉じる場所に移動しない場合は、メモリをクリーンアップする必要があります。

これで、接続ハンドルを使用すると、mysql_closeを呼び出すと言います。