无法替换从“ps aux”UNIX命令的输出派生的NSArray

时间:2011-08-23 06:13:41

标签: iphone objective-c

我试图替换数组“lines2”的第7个索引。 NSMUTABLEARRAY“lines2”是从UNIX命令“ps aux”派生的,我怀疑这个命令返回一个NSCFStrings数组。我现在基本上试图用“Ss(Running)”取代“Ss”。问题是每次程序到达试图替换特定数组元素的部分时,我都会收到SIGABRT错误。我的viewController的代码如下。

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

NSTask *task;
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];
[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(@"%@",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];
    }

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

    if([[lines2 objectAtIndex:7] isEqualToString:@"Ss"]){
        [[lines2 objectAtIndex:0] replaceObjectAtIndex:7 withObject:@"SS (Running)"];

    }
}

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

您没有说出您所看到的错误是什么,但您无法更改NSArray中的值,因为NSArray是一个不可变的容器。

如果要进行修改,请使用NSMutableArray。如果你已经有一个NSArray(如-componentsSeparatedByString:的返回值),你可以通过这样做得到一个可变数组:

NSMutableArray * myMutableArray = [NSMutableArray arrayWithArray:lines2];

答案 1 :(得分:0)

NSArray不可变。首先将其复制到NSMutableArray(例如使用[NSMutableArray arrayWithArray:]),以便您可以对其进行操作。

编译期间没有收到任何警告吗?

答案 2 :(得分:0)

请查看方法-componentsSeparatedByString:的文档。签名是:

- (NSArray *)componentsSeparatedByString:(NSString *)separator

请注意,返回类型为NSArray。这是一个不可变的对象。即使检查返回的对象(例如使用调试器或NSLog)显示它实际上是可变的,您也不能更改它。您必须 respect the API contract。 (阅读标题为“接收可变对象”的链接部分。)

那就是说,错误的直接原因是这一行:

[[lines2 objectAtIndex:0] replaceObjectAtIndex:7 withObject:@"SS (Running)"];
 ^^^^^^^^^^^^^^^^^^^^^^^^ This is wrong

lines2是一个字符串数组。 [lines2 objectAtIndex: 0]是一个字符串。你为什么要发送-replaceObjectAtIndex:withObject:呢?