【问题标题】:NSMutableArray of NSStrings contains actual data or just pointers to the dataNSStrings 的 NSMutableArray 包含实际数据或只是指向数据的指针
【发布时间】:2010-07-24 01:56:01
【问题描述】:

我对 Objective C 比较陌生,虽然我一直在努力编写 iPhone 应用程序,但我想我需要一些帮助来理解一些东西。

我将字符串的动态列表存储在 NSMutableArray 中,这是我的主类的属性。在我的初始化中,我分配并初始化以存储 100 个项目:

stringList = [[NSMutableArray alloc] initWithCapacity:100];

在获取字符串时(从传入数据),我将它们作为对象添加到数组中:

NSString *newString = [stringMaker makeStringFromData:data];
[stringList addObject:newString];

所以要了解这里真正发生的事情。如果我已经添加了 5 次,那么我在 NSMutableArray 中到底有什么?只是指向 5 个字符串或实际字符串的指针?我曾假设 addObject 实际上复制了数据。如果我的 stringMaker 类要开始正确释放东西,我最终会得到指向任何东西的指针吗?有没有更好的方法来确保我列表中的字符串不会被释放或重新指向其他内容?还是我误解了它的工作原理?

到目前为止,我目前对这部分没有任何问题。但是我对泄漏和发布东西有点动摇。

导致我这样做的原因是,当我通过以下方式修改其中一个字符串时,我确实遇到了问题:

[stringList replaceObjectAtIndex: stringIndex withObject: stringMaker.lastStringUsed];

一段时间后,当我回来访问该索引处的对象时,它是 lastStringUsed 的最后一个,而不是我替换它时的那个。这向我表明,我所做的只是设置了一个指针,并没有在该指针处保存数据。注意 lastStringUsed 是 stringMaker 类的一个属性,是一个 NSMutableString。

所以要清楚.. 在 stringMaker 中的不同点我正在做一个:

 [lastStringUsed setString: someString];

(顺便说一句,那实际上是在移动数据吗?)

然后在我的主类中,我正在执行上面显示的 replaceObjectAtIndex。然后其他一些 stringMaker 方法正在重置 lastStringUsed。然后稍后当我在该索引处访问我的 stringList 时,它是新的 lastStringUsed 值,而不是我执行 replaceObjectAtIndex 时的任何值。

编辑 - 现已解决 - 仍然需要对 NSARRAYS 和琴弦进行夜间课程并正确保留和释放

我现在要做的就是分配一个新字符串...

NSString *replacementString = [[NSString alloc] initWithCapacity: 310];
[replacementString setString:stringMaker.lastStringUsed];
[stringList replaceObjectAtIndex:stringIndex withObject:replacementString];

现在我下次更改 lastStringUsed 时,它不会同时更改 stringList 中的那个。

【问题讨论】:

  • 您已经考虑了这么多,以至于您已经回答了自己的问题。它们只是指针。通过传递一个字符串,你永远不会传递数据,只是一个指针。除了追逐所述指针以获取“实际”字符串数据之外,您无能为力,尽管您可以获得(指向)数据副本。

标签: iphone objective-c nsstring nsmutablearray nsmutablestring


【解决方案1】:

当您将对象添加到数组或字典时,该对象将由该数组或字典保留。在调用 addObject 之前和之后查看要放入数组的对象的保留计数:

【讨论】:

  • NSDictionary 键被复制而不是保留
  • 好点,我应该说清楚,但 badweasel 询问的是添加的对象而不是键,所以我专注于那个。
  • 好酷。谢谢。关于问题 2 的任何想法?解释我想要完成的事情有点困难。但是当我在索引处替换对象时,我认为它将 stingMaker.lastStringUsed 放在那里,而不是将指针放在 lastStringUsed 中。因为稍后当我访问该索引时,它指向 lastStringUsed 指向 NOW 的任何内容,而不是我替换它时它指向的内容。有道理? OR.. OR.. 当我更新 lastStringUsed 时,该内存位置的字符串实际上正在发生变化。也许每次我用 lastStringUsed 替换对象时,它都会分配完全相同的指针。
  • 对我来说,很难理解您要做什么以及字符串生成器返回什么。请分享一个完整的代码示例来演示问题或归结问题。
  • 我在一个 iPhone 应用程序中有 12,000 多行代码将在几天内提交。我不能准确地发布一个可以准确描述我正在尝试做的事情的片段。编写一个小应用程序来演示我遇到的一个问题会更合适,我没有时间解决。我可以想到 3 种方法来修复它,1- 使用 NSDictionary 而不是 NSMutableArray,2- 当我替换对象时分配一个新的 NSString,以及 3- 为 100 个字符串分配我需要的确切内存并将数据移动到其中每次记忆。所以我会点击解决并继续前进。谢谢大家!
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多