утечка памяти в sqlite в iphone с помощью [NSString stringWithUTF8String: (char *) sqlite3_column_text - PullRequest
4 голосов
/ 05 ноября 2010

Я получаю сообщение об утечке памяти из этого оператора 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];
}

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

Ответы [ 2 ]

4 голосов
/ 05 ноября 2010

Вы должны выпустить своего ивара в розыгрыш:

-(void) dealloc
{ 
  [personName release];
  [personEmail release]; 
  [personMobile release];
  personName = nil; // Optionnal
  personEmail = nil; // Optionnal
  personMobile = nil; // Optionnal
  [super dealloc]; 
}
0 голосов
/ 05 ноября 2010

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

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

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