我在整个iOS应用程序中使用以下类型的对象引用复制功能。
例如objectA = objectB;
当您对对象A执行操作/更改时,它将自动反映在对象B中。您不需要再次将对象A复制到对象B以反映对象B中的更改,因为它们指向/引用相同的位置(地址)。
问题是,在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。
我制作了一个简单的片段,我认为它将反映您的实际情况:一个内部有可变容器的不可变容器。
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〕突变dict{KEY=NEW;}
2015年4月15日08:37:09.741 prova[92:117578]来自原始来源{KEY=NEW;}
此外,两个对象都具有预期的相同地址:
(lldb)表达式dict(__NSDictionaryM*)$2=0x0000001003004a0 1键/值对
(lldb)表达式array.firstObject(__NSDictionaryM*)$3=0x00000001003004a0 1密钥/值对
试着设置如下。
NSMutableDictionary *fieldObj =
[
self.theData[indexPath.section ][indexPath.row]
mutableCopy
];
&检查我相信它会起作用的。