指向同一地址的两个对象不起作用。例如newArray = oldArray

时间:2015-04-15 06:17:48

标签: ios objective-c deep-copy shallow-copy ios8.3

我在iOS应用程序中使用以下类型的对象引用复制功能。

e.g。 objectA = objectB;

当您对objectA执行操作/更改时,它会自动反映在objectB中。您不需要再次将objectA复制到objectB以反映objectB中的更改,因为它们指向/引用相同的位置(地址)。

问题是它在iOS 8.2之前工作正常,但它似乎根本无法在iOS 8.3中运行。

以下是其中一个无法正常运行的代码段。

    NSMutableDictionary *fieldObj = self.theData[indexPath.section ][indexPath.row];

    // Adding text to data array
    [fieldObj setObject:textField.text.stringByStrippingHTML forKey:@"value"];

    NSLog(@"Line 1 \n%@",fieldObj);
    NSLog(@"Line 2 \n%@",self.theData[indexPath.section][indexPath.row]);

从上面代码第1行和第2行向iOS 8.2提供相同的输出。

Line 1 
  {
    name = Name;
    required = NO;
    type = 4;
    value = asdfasdfasdfasdfsad;
  }
Line 2 
  {
    name = Name;
    required = NO;
    type = 4;
    value = asdfasdfasdfasdfsad;
  }

然而在iOS 8.3中,他们提供不同的输出。

Line 1 
  {
    name = Name;
    required = NO;
    type = 4;
    value = asdfasdfasdfasdfsad;
  }
Line 2 
  {
    name = Name;
    required = NO;
    type = 4;
    value = "";
  }

我在这里做错了吗?

如果没有人知道这个问题以及如何解决它?

修改 对于上述误导性问题,我发现上述问题背后的原因是indexPathForItemAtPoint:(CGPoint)仅在iOS 8.3中返回错误的indexPath。

The code I have used is as follow:
// retrieve indexpath from uitextfield
    CGPoint pos = [textField convertPoint:CGPointZero toView:self.collectionView];
    NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:pos];

以上代码在iOS版本8.2中运行良好。

2 个答案:

答案 0 :(得分:2)

我制作了简单的片段,我认为它会反映你的实际情况:一个内置可变容器的不可变容器。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        NSArray * array = @[@{@"KEY" : @"OLD" }.mutableCopy];
        NSMutableDictionary * dict = array.firstObject;
        [dict setObject:@"NEW" forKey:@"KEY"];
        NSLog(@"Mutated dict %@",dict);
        NSLog(@"From original source %@",array.firstObject);



    }
    return 0;
}

一切似乎都按预期工作,你确定你在其他地方做某事吗?

  

2015-04-15 08:37:09.740 prova [912:117578]变异的字典{       KEY = NEW; }
2015-04-15 08:37:09.741 prova [912:117578]来自原始出处{       KEY = NEW; }

此外,两个对象的地址与预期的相同:

  

(lldb)表达式dict(__ NSDictionaryM *)$ 2 = 0x00000001003004a0 1   键/值对
(lldb)表达式array.firstObject(__ NSDictionaryM *)   $ 3 = 0x00000001003004a0 1键/值对

答案 1 :(得分:0)

尝试将其设置如下。

NSMutableDictionary *fieldObj = 
[
     self.theData[indexPath.section ][indexPath.row]
     mutableCopy
];

&安培;校验。我相信它会奏效。