我试图替换数组“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)"];
}
}
非常感谢任何帮助!
答案 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:
呢?