我有两个代码。不工作如下:
NSMutableArray *tmpArray = [[NSMutableArray alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
tmpArray = (NSMutableArray *) [dataSetArray objectAtIndex:i];
// OR use: tmpArray = dataSetArray[i]
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
虽然这有效:
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
... doing stuff
[tmpArray replaceObjectAtIndex:0 withObject:tmpStr];
}
两个问题:
NSMutableArray
。为什么?我宣布它
以上。 ---编辑:
这里是完整的代码:
数据类型为:
dataSetArray:NSMutableArray。但是,它的内容(即dataSetArray [i])是NSArrays(我从excel文件中将它们读入程序)。
NSString *tmpStr = [[NSString alloc] init];
for (int i=0; i<[dataSetArray count]; i++) {
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithArray:[dataSetArray objectAtIndex:i]];
for (int j=0; j<[tmpArray count]; j++) {
if ( [dataSetArray[0][j] isEqualToString:@"Number"] ) {continue;}
tmpStr = (NSString *) [tmpArray objectAtIndex:j];
// replace single backslash by double-backslash:
tmpStr = [tmpStr stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"];
// replace first dollar sign by "<p>\\[" and second by "\\]</p>"
// Use a methode defined in the NSString+Extension
tmpStr = [tmpStr replaceTexFormulaSigns:tmpStr];
//NSLog(@"j=%d", j);
//NSLog(@"tmpArray is of type: %@", [tmpArray class]);
//NSLog(@" tmpStr is of type: %@", [tmpStr class]);
[tmpArray replaceObjectAtIndex:j withObject:tmpStr];
}
[dataSetArray replaceObjectAtIndex:i withObject:tmpArray];
}
所以,即使我使用你的建议,我仍然面临内部数组的相同问题。
答案 0 :(得分:0)
第一个代码不会产生NSMutableArray。为什么?我在上面声明。
引用变量tmpArray
的声明不会更改引用对象的类型。它仍然是一个(不可变的)数组。
在第一个片段的最开头创建可变数组没有任何意义,因为它的引用被覆盖。
是否有更好的方法来获得相同的结果。我只是不喜欢在循环中定义变量。这使得代码不可读。
是。第二个例子在某种程度上起作用,但做了一些完全不同的事情。 (它总是创建一个包含单个项目的新数组。不,这不是真的。根本不应该编译。)
你应该这样做:
NSMutableArray *tmpArray = [dataSetArray mutableCopy];
for (int i=0; i<[dataSetArray count]; i++)
{
…
[tmpArray replaceObjectAtIndex:i withObject:tmpStr];
}
你应该真正获得有关对象和对象引用的一些额外知识。