2010-09-06 49 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