当滚动方式太低时,UITableView应用程序崩溃

时间:2009-04-04 20:38:36

标签: iphone objective-c cocoa-touch

当我向下滚动表格时,应用程序会崩溃。我无法找到代码中的错误。

这是我的代码:

NSMutableDictionary *tableDataDictionary;
NSInteger *rows_in_section;


-(void) initView
{
    if (!tableDataDictionary)
    {
        tableDataDictionary = [ [NSMutableDictionary alloc] init];
    }
    [self reloadTableData];
}

-(void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [mainTableView deselectRowAtIndexPath: [mainTableView indexPathForSelectedRow] animated:NO];

    [tableDataDictionary release];
    tableDataDictionary = nil;
    free(rows_in_section);
}

-(void) reloadTableData {
    [tableDataDictionary removeAllObjects];


    //Sections
    if (rows_in_section)
    {
        free(rows_in_section);
    }

    rows_in_section = (NSInteger*)calloc(25, sizeof(NSInteger));
    for (int i = 0; i <= 25; i++)
    {
        rows_in_section[i] = 0;
    }

    NSMutableArray *words_in_section = [ [NSMutableArray alloc] init];

    int cur_section = -1;

    while ( TRUE )
    {
        WordObject *tempWordObj = [ [WordsDatabase sharedWordsDatabase] getNextWordABC];
        if (!tempWordObj)
        {
            [tableDataDictionary setObject:words_in_section forKey:[NSNumber numberWithInt: cur_section] ];
            [tempWordObj release];

            [tableDataDictionary setObject:[words_in_section copy] forKey:[NSNumber numberWithInt: cur_section] ];
            [words_in_section removeAllObjects];

            break;
        }

        //First loop
        if (cur_section == -1) cur_section = toupper([ [tempWordObj word] characterAtIndex:0 ] ) - 'A';

        //If a has letter changed, assign the previous array to a dictionary
        if ( (toupper([ [tempWordObj word] characterAtIndex:0 ] ) - 'A') != cur_section )
        {
            [tableDataDictionary setObject:[words_in_section copy] forKey:[NSNumber numberWithInt: cur_section] ];
            [words_in_section removeAllObjects];
        }

        cur_section = toupper([ [tempWordObj word] characterAtIndex:0 ] ) - 'A';

        [words_in_section addObject:tempWordObj];

        [tempWordObj release];
        tempWordObj = nil;

        rows_in_section[cur_section]++;

    }

    [words_in_section release];

    [ [WordsDatabase sharedWordsDatabase] endGettingWordsABC];


    [mainTableView reloadData];
    [mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:NO];

}


//
// Table handling
//

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 26;
}

// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return rows_in_section[section];
}

// Adding a section index here 
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
{ 
    return ALPHA_ARRAY; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return index;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    DebugLog(@"cellForRowAtIndexPath");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }


    WordObject *tempWordObj = [ [tableDataDictionary objectForKey: [NSNumber numberWithInt:[indexPath section] ] ] objectAtIndex: [indexPath row] ];

    if (!tempWordObj)
    {
        DebugLog(@"!tempWordObj");
        return cell;
    }

    cell.text = [tempWordObj word];

    [tempWordObj release];

    return cell;
}

如何通过向下滚动来解决这个问题以及为什么会出现这个问题? 如果您在我的代码中发现任何其他缺点,请告诉我。

提前谢谢你, 伊利亚安德。

1 个答案:

答案 0 :(得分:4)

你不需要这一行;

[tempWordObj release];

[NSDictionary objectForKey]返回一个自动释放的对象,该对象将在函数返回后的某个时间自动释放。