Сбой приложения при прокрутке UITableView для отображения нижних строк

У меня есть приложение, которое отображает данные в UITableView. Однако он вылетает, когда я пытаюсь открыть нижние строки. Надеюсь, кто-то может пролить свет на то, почему это происходит.

-(void)viewDidLoad {

    NSLog(@"myString is :%@", myString);
    int processID = [myString intValue];

    //NSLog(@"transferredArray is %@", transferredArray);
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/ps"];

    arguments = [NSArray arrayWithObjects: @"aux", [NSString stringWithFormat:@"%i", processID],nil];

    [task setArguments: arguments];

    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput:pipe];

    NSFileHandle *file;
    file = [pipe fileHandleForReading];

    [task launch];

    NSData *data;
    data = [file readDataToEndOfFile];

    NSString *string;
    string = [[NSString alloc] initWithData: data
                                   encoding: NSUTF8StringEncoding];

    NSLog(@"ps aux output :%@",string);


    NSArray *lines= [string componentsSeparatedByString:@"\n"];

    NSString *lastline = [lines objectAtIndex:[lines count]-2];
    //  NSLog(@"%@",lastline);




    lines2= [lastline componentsSeparatedByString:@" "];
    NSLog(@"%@",lines2);
    for (int i=0; i<[lines2 count]; i++) {

        if([[lines2 objectAtIndex:i] isEqualToString:@""]){
            [lines2 removeObjectAtIndex:i];
        }

    }


    for (int i=0; i<[lines2 count]; i++) {

        if([[lines2 objectAtIndex:i] isEqualToString:@""]){
            [lines2 removeObjectAtIndex:i];
        }

    }


    NSLog(@"lines2 after for loops is %@", lines2);









    NSLog(@"Lines 2 is%@",lines2);
   // NSLog(@"Status is %@",[lines2 objectAtIndex:7]);


    self.title = @"Process Info";

    label = [[NSMutableArray alloc]init];

    [label addObject:@"User:"];
    [label addObject:@"Process ID:"];
    [label addObject:@"CPU(%):"];
    [label addObject:@"MEM(%):"];
    [label addObject:@"VSZ"];
    [label addObject:@"RSS"];
    [label addObject:@"TT"];
    [label addObject:@"STAT:"];
    [label addObject:@"Time Started:"];
    [label addObject:@"Time Elapsed:"];
    [label addObject:@"Command:"];

    [super viewDidLoad];
}




-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];   

    UILabel *label2;
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]autorelease];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
        cell.textColor = [UIColor colorWithRed:154.0/255.0 green:14.0/255.0 blue:2.0/255.0 alpha:1];
        cell.font = [UIFont systemFontOfSize:16.0];

        label2 =  [[[UILabel alloc] initWithFrame:CGRectMake(120.0, 0, 240.0, 
                                                             tableView.rowHeight)]autorelease];

        label2.font = [UIFont systemFontOfSize:16.0]; 
        NSString *cellValue1 = [lines2 objectAtIndex:indexPath.row];
        label2.text = cellValue1;
        label2.textAlignment = UITextAlignmentLeft; 
        label2.textColor = [UIColor blackColor]; 
        label2.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | 
        UIViewAutoresizingFlexibleHeight; 
        [cell.contentView addSubview:label2]; 

    }


    NSString *cellValue = [label objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;

    return cell;
}


- (void)viewWillDisappear:(BOOL)animated
{
    [task terminate];
    [task release];
}


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [lines2 count];
}



- (void)dealloc 
{
    //[transferredArray release];
    //[myString release];
    //[arguments release];
    //[ResultStringID release];
    //[values release];
    //[label release];
    [super dealloc];
}

Примечание. Я закомментировал все [выпуски] в методе Dealloc, чтобы предотвратить любые другие ошибки EXEC_BAD_ACCESS, хотя текущая ошибка, с которой я сталкиваюсь, — EXEC_BAD_ACCESS.


person Jared Aaron Loo    schedule 12.09.2011    source источник
comment
вам дано [количество строк2] в методе numberOfRowsInSection, но вы используете массив меток в cellForRowAtIndexPath. Если количество меток меньше, чем количество строк2, произойдет сбой   -  person Narayana    schedule 12.09.2011


Ответы (2)


На ум приходит пара вещей:

  • Вы пытаетесь удалить объекты из NSArray (lines2). Это невозможно.
  • Ваше табличное представление определяет количество строк по количеству lines2, но вы пытаетесь получить доступ к массиву labels с помощью indexPath.row - если в lines2 больше записей, чем labels, это приведет к сбою.
  • Вы никогда не меняете значение в метке label2, которая будет выглядеть очень странно при прокрутке. Вы должны дать этому тег, а затем изменить содержимое в том же месте, где вы установили cell.textLabel.text
  • lines2 выпускается автоматически, поэтому его может не быть рядом, когда вы получите к нему доступ в cellForRowAtIndexPath.
person jrturton    schedule 12.09.2011

поместите [lines2 keep] в качестве последнего оператора в методе viewDidLoad, он будет работать нормально.

person Narayana    schedule 12.09.2011