【发布时间】: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