我对 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 中的那个。