Мне показалось, что я держу голову над удержаниями и выпусками до тех пор, пока не будет реализована ARC, я стараюсь повторно использовать указатели, чтобы избежать необходимости повторного объявления их все время.
Но с ARC это создает утечку. Я предполагаю, что это только освобождение последнего объекта, назначенного указателю 'tmp', я предполагал, что когда я дал указателю новый объект, старый объект будет автоматически освобожден. Обертывание функции в autoreleasepool, кажется, делает свою работу, но действительно ли это идеальное решение или мой стиль кодирования неверен?
Вот виновная функция, которая, кажется, съедает весь мой баран после того, как я запускаю его несколько сотен раз:
- (void) saveJDictEntry:(JDictEntry *)entry {
const char * query;
char * errMsg;
NSString *queryString;
sqlite3_stmt * statement;
[self connect];
// Insert the word..
queryString = [NSString stringWithFormat:@"INSERT INTO words (seq) VALUES (%i)", entry.number];
query = [queryString UTF8String];
if (sqlite3_exec(database, query, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Statement failed %@ %@", errMsg, queryString);
}
// Get the last id we inserted..
NSUInteger lastId = 0;
queryString = @"SELECT last_insert_rowid()";
query = [queryString UTF8String];
sqlite3_prepare_v2(database, query, -1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_ROW) {
lastId = sqlite3_column_int(statement, 0);
} else {
NSLog(@"Failed to fetch last Id after saving");
}
sqlite3_finalize(statement);
entry.databaseId = lastId;
entry.saved = true;
// Kana...
queryString = [NSString stringWithFormat:@"INSERT INTO words_kana (word_id, kana) VALUES (%i, '%@')", entry.databaseId, entry.kana ];
query = [queryString UTF8String];
if (sqlite3_exec(database, query, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Statement failed %@ %@", errMsg, queryString);
}
// Kanji ...
for(NSString * _kanji in entry.kanji) {
queryString = [NSString stringWithFormat:@"INSERT INTO words_kanji (word_id, kanji) VALUES (%i, '%@')", entry.databaseId, _kanji];
query = [queryString UTF8String];
if (sqlite3_exec(database, query, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Statement failed %@ %@", errMsg, queryString);
}
}
// Pos..
for(NSString * _pos in entry.pos) {
queryString = [NSString stringWithFormat:@"INSERT INTO words_pos (word_id, pos) VALUES (%i, '%@')", entry.databaseId, _pos];
query = [queryString UTF8String];
if (sqlite3_exec(database, query, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Statement failed %@ %@", errMsg, queryString);
}
}
// Gloss
for(NSString * _gloss in entry.gloss) {
NSString * glossField = [_gloss stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
queryString = [NSString stringWithFormat:@"INSERT INTO words_gloss (word_id, gloss) VALUES (%i, '%@')", entry.databaseId, glossField];
query = [queryString UTF8String];
if (sqlite3_exec(database, query, NULL, NULL, &errMsg) != SQLITE_OK) {
NSLog(@"Statement failed %@ %@", errMsg, queryString);
}
}
}