2011-08-23 31 views
1

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

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

请查看方法-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:呢?

0

你不说你看到的错误是什么,但是你不能改变NSArray中的值,因为NSArray是一个不可变的容器。

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

NSMutableArray * myMutableArray = [NSMutableArray arrayWithArray:lines2]; 
+0

其实它的一个NSMutableArray,我忘了提及。我认为它抛出一个SIGABRT是因为我试图用一个NSString替换一个NSCFString(ps aux的输出)。 –

0

NSArray不可变。首先将其复制到NSMutableArray(例如,使用[NSMutableArray arrayWithArray:]),以便操纵它。

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

+0

对不起,它应该是NSMutableArray,我输错了。它仍然抛出这个异常: –

+0

- [NSCFString replaceObjectAtIndex:withObject:]:无法识别的选择器发送到实例0x4b25b70 2011-08-23 15:27:10.224 TableViewController_09 [3376:207]由于未捕获的异常终止应用程序'NSInvalidArgumentException ',原因:' - [NSCFString replaceObjectAtIndex:withObject:]:无法识别的选择发送到实例0x4b25b70' –