Утечка памяти iphone sqlite с [NSString stringWithUTF8String:(char*)sqlite3_column_text

Я продолжаю получать индикацию утечки памяти из этого оператора sql, когда я присваиваю значение, полученное из базы данных...

Person *tmpPerson = [[Person alloc] init];

tmpPerson.personName = [NSString stringWithUTF8String:    (char*)sqlite3_column_text(SelectPersonStmt, 0)];
tmpPerson.personEmail = [NSString stringWithUTF8String:    (char*)sqlite3_column_text(SelectPersonStmt, 1)];

[personList addObject:tmpPerson];
[tmpPerson release];

Однако, если я заменю объект класса nsobject ... tmpPerson на обычные NSString ... утечки больше не жалуются? Кто-нибудь знает, почему?

NSString * personName = [NSString stringWithUTF8String:(char*)sqlite3_column_text(SelectPersonStmt, 0)];
NSString * personEmail = [NSString stringWithUTF8String:(char*)sqlite3_column_text(SelectPersonStmt, 1)];

Вот мое определение класса... с ним что-то не так?

@interface Person : NSObject {

 NSString* personName;
 NSString* personMobile;
 NSString* personEmail;

}

@property (nonatomic, retain) NSString* personName, *personEmail, *personMobile;

- (id)init
{
  if ((self = [super init])) {  
    personName = [NSString string];
    personEmail = [NSString string];
    personMobile = [NSString string];
  }
  return self;
}

Я что-то упустил здесь? Должен ли я даже инициализировать эти строки, похоже, это не имеет никакого значения? Я поместил их туда, если хотел инициализировать их некоторым значением по умолчанию.

Тестируя это с помощью инструментов, я заметил, что утечка памяти срабатывает во время метода освобождения памяти. Я пробовал это, и это тоже не помогло

-(void) dealloc

{
  personName = nil;
  personEmail = nil;
  [super dealloc];
}

Любая помощь будет принята с благодарностью. Я видел много сообщений, связанных с этим, но я не уверен, что люди ведут себя так же, как я упомянул.


person ArdenDev    schedule 05.11.2010    source источник


Ответы (2)


Вы должны освободить свой ivar в Dealloc:

-(void) dealloc
{ 
  [personName release];
  [personEmail release]; 
  [personMobile release];
  personName = nil; // Optionnal
  personEmail = nil; // Optionnal
  personMobile = nil; // Optionnal
  [super dealloc]; 
}
person Benoît    schedule 05.11.2010

Вы должны освободить используемые строки в структуре Person, не устанавливая ее в NULL. Как только вы установили его в NULL и нет других объектов, ссылающихся на него, у вас есть утечка, система не знает, как ее восстановить.

РЕДАКТИРОВАТЬ: блин, мой ответ опоздал на 10 секунд :P

person Istvan    schedule 05.11.2010