【问题标题】:Pointers and dictionary : copied or stored?指针和字典:复制还是存储?
【发布时间】:2013-03-24 01:15:00
【问题描述】:

似乎存储在字典中的对象是原始对象的副本! 好奇怪!!

在下面的代码中,

myData = [NSMutableDictionary dictionaryWithObjects:[NSArray arrayWithObjects:myEntries, preambule, nil]
            forKeys:[NSArray arrayWithObjects:@"myEntries", @"preambule", nil]];

NSMutableArray * myEntriesDico = [myData objectForKey:@"myEntries"] ;
NSLog(@"!!!!!!!!! Address of myEntries (in the le dict) : %p", &myEntriesDico);
NSLog(@"!!!!!!!!! Address of myEntries : %p", &myEntries);

我有两个不同的地址!

有人知道发生了什么吗?

【问题讨论】:

  • 始终是 DeepCopy。
  • @AnoopVaidya:我不确定你所说的“它”是什么,但 AFAIK Cocoa 没有深度复制功能。
  • 我是不是说反之亦然... Deep 意味着 byValue ,浅层意味着 byRef... :(
  • @AnoopVaidya - 对于引用类型(例如NSObject *),然后(a)赋值复制值(引用)(b)浅拷贝创建引用类型的新对象并分配值源对象的实例变量与新对象的实例变量 (c) 深度复制 (b) 递归执行 - 如果任何源对象实例变量是引用类型,则为这些对象创建新对象。除非另有说明,否则 Obj-C 集合只是进行赋值(通常使用保留),它们不会浅拷贝或深拷贝对象。
  • @CRD:我卡住了。我有一本字典,添加了一个字符串 = @“A”。后来我更新了字符串=@“B”。字典没有反映@"B",它仍然有@"A"。

标签: objective-c cocoa pointers memory nsdictionary


【解决方案1】:

您只是打印了错误的内容。 myEntriesDicomyEntries 是两个 不同 变量,它们的 相同 - 并且这些值是引用。

当您将&myEntries 传递给NSLog 时,您传递的是对myEntries 变量的引用,而不是其中的值,myEntriesDico 也是如此。

删除两个&,这将传递作为引用的值,%p 将正确格式化它们 - 并且两个输出应该相同。

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2017-02-09
    • 2013-09-08
    • 2021-05-29
    • 2017-04-13
    • 2022-01-07
    相关资源
    最近更新 更多