strDBAppVer
сначала устанавливается на [NSMutableString stringWithString:@""]
, что разумно с точки зрения памяти.Однако позже вы полностью переустановите переменную на целый другой объект , созданный alloc
/ initWithUTF8String:
, в результате чего strDBAppVer иногда будет указывать на уже автоматически освобожденный объект,и иногда (когда выражение if
истинно) указывают на объект с сохраняемым счетчиком + 1.
Вот почему есть утечка, но ее устранение вызывает проблемы.Если оператор if
имеет значение true, вы устанавливаете переменную так, чтобы она указывала на объект со счетом +1, а если он ложный, вы устанавливаете переменную так, чтобы она указала на совершенно другой объект с0 count.
Это выглядит как путаница с изменяемыми строками.Знаете ли вы, что, по крайней мере в опубликованном коде, вы на самом деле не мутируете strDBAppVer
?Попробуйте вместо этого:
NSString* strDBAppVer = @"";
Затем, внутри вашего оператора if,
strDBAppVer = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statementAppVer,0)];
//Now, realizing that strDBAppVer has just been reassigned to point
//to an entirely new object, one created with alloc/init, and therefore one that
//needs to be released,
[strDBAppVer autorelease];
Обратите внимание, что autorelease находится только внутри оператора if, поэтому он случайно не перевыпускает ваше первоначальное значение@""
.(Поскольку постоянные строки не должны быть освобождены.)