0
私は、以下のように私のsqliteクエリコードを実行しています。インストゥルメントは、NSDictionaryのallocおよびrelease行(whileループの内側)でメモリリークをキャッチします。誰かがそれらのalloc/releaseで間違っていることを指摘できますか?sqlite3 NSDictionaryメモリリーク
- (NSMutableArray *)executeQuery:(NSString *)sql arguments:(NSArray *)args {
sqlite3_stmt *sqlStmt;
if (![self prepareSql:sql inStatament:(&sqlStmt)])
return nil;
int i = 0;
int queryParamCount = sqlite3_bind_parameter_count(sqlStmt);
while (i++ < queryParamCount)
[self bindObject:[args objectAtIndex:(i - 1)] toColumn:i inStatament:sqlStmt];
NSMutableArray *arrayList = [[NSMutableArray alloc]init]; // instrument marks leak 0.1 % on this line
NSUInteger rcnt= arrayList.retainCount;
int columnCount = sqlite3_column_count(sqlStmt);
while ([self hasData:sqlStmt]) {
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; // instrument marks leak 13% on this line
for (i = 0; i < columnCount; ++i) {
id columnName = [self columnName:sqlStmt columnIndex:i];
id columnData = [self columnData:sqlStmt columnIndex:i];
[dictionary setObject:columnData forKey:columnName];
}
[arrayList addObject:dictionary];
[dictionary release];// instrument marks leak 86.9 % on this line
}
sqlite3_finalize(sqlStmt);
rcnt=arrayList.retainCount;
return arrayList ;
}
ヘルプ/ポインターは大変ありがとうございます。数日間このことに苦しんできました。
ありがとうございました。 arraylistでautoreleaseを試みると、プログラムは "割り付け解除されたインスタンスに送られたメッセージ"でクラッシュします。 arrayListをどこか別の場所に公開していますか? – zolio
おそらく、あなたはexecuteQueryの外側に保持/解放のプロパティがないことを意味します:引き数: 関数によって返された配列を保持していることを確認し、完了したら解放します。 戻り値の自動返却は、関数内の正しいアクションです。したがって、エラーは表示された機能の外にある可能性があります。 – fsaint