2010-09-06 48 views
2

我有以下代碼顯示內存泄漏的對象最喜歡附近的語句與stringWithUTF8String。由於stringWithUTF8String iPhone內存泄漏

我已經宣佈在物業最愛

-(NSMutableArray *) readFavoritesFromDatabase 
{ 
// Check if database is present 
[self setDatabaseNameAndPath]; 
[self checkAndCreateDatabase]; 

// Setup the database object 
sqlite3 *database; 

//Initialize favorites array 
if (favorites == nil) 
{ 
    [favorites release]; 
    favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    favorites = nil; 
    [favorites removeAllObjects]; 
} 


// Open the database from the users file system 
if(sqlite3_open([self.dataBasePath UTF8String], &database) == SQLITE_OK) 
{ 
    // Setup the SQL Statement and compile it for faster access 
    const char *sqlStatement = "select * from Favorites"; 
    sqlite3_stmt *compiledStatement; 

    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 

    // Loop through the results and add them to the favorites array 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
    { 
    // Create Favorite object and add it to the Favorite array 
    Favorite *favorite = [[[Favorite alloc] init] autorelease]; 

    favorite.cameraID = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 0)]; 
    favorite.cameraName = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 1)]; 
    favorite.cameraLink = [NSString stringWithUTF8String:(const char*)sqlite3_column_text(compiledStatement, 2)]; 

    [self.favorites addObject:favorite]; 
    //[favorite.cameraID release]; 
// [favorite.cameraName release]; 
// [favorite.cameraLink release]; 
    } 

    // If favorite cameras exists in database, then sort the Favorites array 
    if([self.favorites count]>0) 
    { 

    NSSortDescriptor *favoritesNameSorter = [[NSSortDescriptor alloc] initWithKey:@"cameraName" ascending:YES]; 
    [self.favorites sortUsingDescriptors:[NSArray arrayWithObject:favoritesNameSorter]]; 
    [favoritesNameSorter release]; 
    } 
    } 

    // Release the compiled statement from memory 
    sqlite3_finalize(compiledStatement); 
} 

// Close the database 
if(database !=nil) 
{ 
    sqlite3_close(database); 
    return self.favorites; 
} 
else 
{ 
    return nil; 
} 
} 

請讓我知道如何解決這個內存泄漏問題 在此先感謝。

+0

請參閱我的答案在此鏈接[此處輸入鏈接的描述] [1] [1]:http://stackoverflow.com/questions/6185533/memory-leak-in-nsstring-stringwithutf8string/9955130#9955130 希望這會幫助你 – 2012-03-31 10:44:26

回答

-1

我在你的stringWithUTF8String中看不到任何泄漏,該代碼工作正常。但是,看看整個方法,我發現有些東西會造成內存問題,例如泄漏或崩潰。如果你已經宣佈了收藏屬性,那麼你應該使用self.favorites這裏

//Initialize favorites array 
if (favorites == nil) 
{ 
    [favorites release]; 
    favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    favorites = nil; 
    [favorites removeAllObjects]; 
} 

變爲:

//Initialize favorites array 
if (self.favorites == nil) 
{ 
    self.favorites = [[NSMutableArray alloc] init]; 
} 
else 
{ 
    self.favorites = nil; 
} 

它會幫助你很多事情在內存管理人員,就像在你的其他條件,你設置變量爲零但不釋放它,並在第一個條件,你釋放一個零對象?

+0

我認爲我的第一個答案不夠清楚,並沒有真正直接回答這個問題。希望編輯後的版本能夠澄清並幫助提問者 – vodkhang 2010-09-06 07:14:25

+1

如果'favorites'屬性被定義爲'(retain)',則不應該使用它。 – 2010-09-06 07:33:31

+0

+1如果保留,則不使用此項。 – jer 2010-09-06 07:36:30

1

使用該安全的方法:

Favorite *tempFavorite = [[Favorite alloc] init]; 
self.favorite = tempFavorite; 
[tempFavorite release]; 

Normaly,在你最喜歡的dealloc功能,你應該調用超級的dealloc函數之前有什麼必要刪除所有對象和清潔。

使用這種方法,你不必擔心,如果喜歡的是零或不是因爲Objective-C的允許調用方法無對象

問候

梅厄Assayag

+0

最喜歡這裏是一個局部變量。所以我沒有看到這樣做的理由。請詳細說明。 – user382535 2010-09-06 10:32:42

1

不確定在stringWithUTF8String泄漏,但是這是一個問題:

favorites = nil; 
[favorites removeAllObjects]; 

你漏了什麼是favorites,然後告訴nil刪除所有對象的對象 - 根據定義,它沒有任何對象。然後稍後嘗試向其添加對象;那也行不通。

+0

我以前只保留了[收藏夾removeAllObjects],但是這並沒有消除內存泄漏。此代碼正常工作 – user382535 2010-09-06 10:21:37

+0

將'nil'指定給'favorites'後,舊內容會發生什麼變化? – 2010-09-06 13:29:28