为什么 replaceObjectAtIndex 取决于我是否在循环中使用新定义?

Why does replaceObjectAtIndex depend on whether or not I use a new definition in the loop?

我有两个密码。以下是不工作的:

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];
}

两个问题:

  1. 第一个代码没有生成 NSMutableArray。为什么?我声明 多于。
  2. 是否有更好的方法来获得相同的结果。我只是 不喜欢在循环中定义变量。这使得代码 不可读。

--- 编辑:

这里是完整代码:

数据类型是:

dataSetArray:NSMutableArray。但是,它的内容(即 dataSetArray[i])是 NSArray(我从 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];
}

所以即使我使用了你的建议,我仍然面临着与内部数组相同的问题。

The first code doesn't yield a NSMutableArray. Why? I declare it above.

引用变量的声明tmpArray不会改变引用对象的类型。它仍然是一个(不可变的)数组。

在第一个片段的开头创建可变数组没有任何意义,因为对它的引用被覆盖了。

Is there a better way to obtain the same result. I just dislike defining variables in a loop. This makes the code unreadable.

是的。第二个示例以某种方式工作,但做一些完全不同的事情。 (它总是创建一个包含单个项目的新数组。不,那不是真的。它根本不应该编译。)

你应该这样做:

NSMutableArray *tmpArray = [dataSetArray mutableCopy];
for (int i=0; i<[dataSetArray count]; i++) 
{
  …
  [tmpArray replaceObjectAtIndex:i withObject:tmpStr];
}

您应该真的获得一些关于对象和对象引用的额外知识。