iPhone内存泄漏问题

时间:2011-02-23 08:47:34

标签: iphone objective-c memory-leaks

当我“构建和分析”时,我没有任何警告。根本没有警告。但是,当我运行'性能工具'时,我有一些红色块:( 我有一张桌子,每个单元都有星(最喜欢的按钮),当我点击星形表演工具显示红色块时。这是我的方法。 我试图'释放'indexPath和channel然后我的应用程序崩溃:(我还在学习内存管理所以请帮忙吗?

- (void) didTapStar: (UIButton *) button withEvent: (UIEvent *) event
{   
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
    int selectedItemRowIndex = indexPath.row;

    Channel *channel = [tableData objectAtIndex:selectedItemRowIndex];  
    channel.IsFavorite = !channel.IsFavorite;

    if(channel.IsFavorite == YES)
    {       
        [button setImage:[UIImage imageNamed:IMG_FAVORITE_STARRED] forState:UIControlStateNormal];      
    }
    else 
    {
        [button setImage:[UIImage imageNamed:IMG_FAVORITE_STAR] forState:UIControlStateNormal];
    }

    [self setSelectedChannelFavoriteStatus:channel];        

    // Reloading data

    [itemsData removeAllObjects];
    [searchedData removeAllObjects];
    [tableData removeAllObjects];

    [self initializeDatabaseStructure];     
    [self getChannelsForSelectedItem];

    Channel *co;    
    for(co in itemsData)
    {
        img1 = [UIImage imageNamed:co.IconPath];
        if(img1 == nil)
        {           
            continue;
        }
        else
        {
            co.IconImage = img1;                                        
        }
    }

    [tableData addObjectsFromArray:itemsData];

    [self.tableView reloadData];        
}

- (void) initializeDatabaseStructure
{
    if(sqlite3_open([[self filePath] UTF8String], &db_beta) != SQLITE_OK)
    {           
        sqlite3_close(db_beta);
        NSAssert(0, MSG_DATABASE_FAILED_TO_OPEN);
    }   
}


- (void) setSelectedChannelFavoriteStatus:(Channel *)channel
{
    NSString *tempIsFavorite;

    if(channel.IsFavorite == YES)
    {
        tempIsFavorite = [[NSString alloc]initWithString:@"1"];
    }
    else 
    {
        tempIsFavorite = [[NSString alloc]initWithString:@"0"];
    }

    NSMutableString *sql = [NSMutableString stringWithFormat:@"UPDATE tblChannels SET IsFavorite = '%@' WHERE ChannelId = %i", tempIsFavorite, channel.ChannelId];

    char *err;
    if(sqlite3_exec(db_beta, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK)
    {
        sqlite3_close(db_beta);
        NSAssert(0, MSG_ERROR_UPDATING_TABLE);
    }
    else 
    {
        NSLog(@"Updating favorite field.");
    }   

    [tempIsFavorite release];
}


- (void) getAllChannels
{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  
    NSString *myString = [prefs stringForKey:PREF_PROVIDER];

    NSString *sql = [NSString stringWithFormat:@"SELECT * FROM tblChannels WHERE ChannelProvider = '%@' ORDER BY ChannelName", myString];

    sqlite3_stmt *cmd;  

    if(sqlite3_prepare_v2(db_beta, [sql UTF8String], -1, &cmd, nil) == SQLITE_OK)
    {
        while(sqlite3_step(cmd) == SQLITE_ROW)
        {               
            char *clnChannelId = (char *) sqlite3_column_text(cmd, 0);
            NSString *m_ChannelId = [[NSString alloc] initWithUTF8String:clnChannelId];

            char *clnChannelName = (char *) sqlite3_column_text(cmd, 1);
            NSString *m_ChannelName = [[NSString alloc] initWithUTF8String:clnChannelName];

            char *clnChannelLogo = (char *) sqlite3_column_text(cmd, 2);
            NSString *m_ChannelLogo = [[NSString alloc] initWithUTF8String:clnChannelLogo];

            char *clnChannelUrl = (char *) sqlite3_column_text(cmd, 3);
            NSString *m_ChannelUrl = [[NSString alloc] initWithUTF8String:clnChannelUrl];   

            char *clnChannelIsFavorite = (char *) sqlite3_column_text(cmd, 5);
            NSString *m_ChannelIsFavorite = [[NSString alloc] initWithUTF8String:clnChannelIsFavorite]; 

            Channel *c = [[Channel alloc]init];
            c.ChannelId = [m_ChannelId integerValue];
            c.Name = m_ChannelName;
            c.IconPath = m_ChannelLogo;
            c.StreamUrl = m_ChannelUrl; 

            if ([m_ChannelIsFavorite isEqualToString:@"0"]) 
            {
                c.IsFavorite = NO;
            }
            else 
            {
                c.IsFavorite = YES;
            }

            [itemsData addObject:c];

            [m_ChannelId release];
            [m_ChannelName release];
            [m_ChannelLogo release];
            [m_ChannelUrl release];
            [m_ChannelIsFavorite release];
            [c release];
        }           
        sqlite3_finalize(cmd);                      
    }
}

1 个答案:

答案 0 :(得分:0)

你调用了很多类方法,它们可能有漏洞!

[self setSelectedChannelFavoriteStatus:channel];        
[self initializeDatabaseStructure];     
[self getChannelsForSelectedItem];