滚动UITableView以显示底行时,应用程序崩溃

时间:2011-09-12 07:28:48

标签: iphone objective-c uitableview exc-bad-access

我有一个在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方法中的所有[release],以防止任何其他EXEC_BAD_ACCESS错误,尽管我遇到的当前错误是EXEC_BAD_ACCESS

2 个答案:

答案 0 :(得分:1)

有些事情让人想起:

  • 您正尝试从NSArray(第2行)中删除对象。这是不可能的。
  • 您的表视图根据lines2计数确定其行数,但您尝试使用indexPath.row访问labels数组 - 如果lines2中有更多条目比labels这会导致崩溃。
  • 您永远不会更改label2标签中的值,滚动时看起来很奇怪。您应该为此标记,然后在设置cell.textLabel.text
  • 的同一位置更改内容
  • lines2已自动发布,因此当您在cellForRowAtIndexPath
  • 中访问时,可能不在身边

答案 1 :(得分:0)

将[lines2 retain]作为viewDidLoad方法中的最后一个语句,它可以正常工作。