2010-11-05 45 views
4

我不斷收到來自該SQL語句中的內存泄漏跡象時,我給你從數據庫中檢索到的值...iphone sqlite的內存泄漏:(字符*)sqlite3_column_text

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]; 

但是如果我用普通的NSString的替換nsobject類對象... tmpPerson ...泄漏不再抱怨了?有誰知道爲什麼?

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]; 
} 

任何幫助將不勝感激。我見過很多與此相關的帖子,但我不確定人們是否獲得了我提到的相同行爲。

回答

4

你必須釋放你的伊娃在的dealloc:

-(void) dealloc 
{ 
    [personName release]; 
    [personEmail release]; 
    [personMobile release]; 
    personName = nil; // Optionnal 
    personEmail = nil; // Optionnal 
    personMobile = nil; // Optionnal 
    [super dealloc]; 
} 
+0

謝謝你的工作! – ArdenDev 2010-11-05 23:18:05

0

您應該釋放使用的字符串在Person結構,而不是將其設置爲NULL。 一旦你將它設置爲NULL,並且沒有其他對象引用它,你就有泄漏,系統不知道如何回收它。

編輯:該死的,我的回答晚了10秒:P