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

时间:2015-07-21 19:46:55

标签: objective-c nsmutablearray

我有两个代码。不工作如下:

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. 是否有更好的方法来获得相同的结果。我只是 不喜欢在循环中定义变量。这使得代码 不可读。
  3. ---编辑:

    这里是完整的代码:

    数据类型为:

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

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

1 个答案:

答案 0 :(得分:0)

  

第一个代码不会产生NSMutableArray。为什么?我在上面声明。

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

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

  

是否有更好的方法来获得相同的结果。我只是不喜欢在循环中定义变量。这使得代码不可读。

是。第二个例子在某种程度上起作用,但做了一些完全不同的事情。 (它总是创建一个包含单个项目的新数组。不,这不是真的。根本不应该编译。)

你应该这样做:

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

你应该真正获得有关对象和对象引用的一些额外知识。