2011-09-12 268 views
0

我有一个应用程序在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

+0

您将得到[lines2计数]在numberOfRowsInSection方法中,但您在cellForRowAtIndexPath中使用标签数组。如果标签数小于lines2,则它会崩溃 – Narayana

回答

1

夫妇的事情映入脑海:

  • 您正在尝试从一个NSArray(lines2)删除对象。这不可能。
  • 您的表格视图决定了其计数为lines2的行数,但您尝试使用indexPath.row访问labels数组 - 如果lines2中的条目多于labels,则会导致崩溃。
  • 您永远不会更改label2标签中的值,这在滚动时看起来会很奇怪。你应该这样给一个标签,然后改变在同一个地方的内容设置cell.textLabel.text
  • lines2会被自动释放,可能无法左右的时候你来访问它在cellForRowAtIndexPath
0

放[lines2保留]作为viewDidLoad方法中的最后一个语句,它将正常工作。