Obj-C, путаница утечки памяти - PullRequest
0 голосов
/ 13 августа 2011

Я использую строку NSMutable, чтобы получить строку из запроса к базе данных.Я назначил переменную с помощью @ "" и затем заполнил, если нашел из базы данных.Я попытался добавить autorelease / release, но это вызывает проблемы со ссылками на вызов базы данных.

Может кто-то указать на мою ошибку?

Я бы набрал этот код, но я почувствовал стрелки анализаторабыли полезны.

enter image description here

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Вы создаете автоматически выпущенную NSMutableString и назначаете указатель strDBAAppVer для указания на него. Но затем вы отбрасываете ссылку на этот объект и получаете указатель strDBAppVer, указывающий на новый объект, строку NSString с счетом сохранения 1.

То, что я думаю, , что вы хотите, находится внутри вашего оператора if примерно так:

NSString* databaseField = [[NSString alloc] initWithUTF ...etc.]
[strDBAppVer setString: databaseField];
[databaseField release];
1 голос
/ 13 августа 2011

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, поэтому он случайно не перевыпускает ваше первоначальное значение@"".(Поскольку постоянные строки не должны быть освобождены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...