XCode在函数之前调用它';这叫什么?

XCode在函数之前调用它';这叫什么?,xcode,cocoa,nsmutabledictionary,Xcode,Cocoa,Nsmutabledictionary,我有一个奇怪的问题,我已经研究/玩了几个小时了 我正在开发一个简单的笔记应用程序,将笔记存储在NSMutableDictionary中,键作为标题,值作为笔记。我有一个委托函数,每次更改时保存NSTextView的内容 -(void)textDidChange:(NSNotification *)notification { NSString *currentNote = [_mainTextField string]; [Data setNote:currentNote for

我有一个奇怪的问题,我已经研究/玩了几个小时了

我正在开发一个简单的笔记应用程序,将笔记存储在
NSMutableDictionary
中,键作为标题,值作为笔记。我有一个委托函数,每次更改时保存
NSTextView
的内容

-(void)textDidChange:(NSNotification *)notification {
    NSString *currentNote = [_mainTextField string];
    [Data setNote:currentNote forKey:currentKey];
}
然后将其添加到字典中

+(void)setNote:(NSString *)note forKey:(NSString *)key {
    [allNotes setObject:note forKey:key];
}
currentKey
是一个全局变量,在其他地方进行了更新(我已经进行了全面测试,工作正常)

这里有点奇怪:您可能希望字典为
setNote:forKey:
的每次调用更新一个键,只要这些键都是唯一的(它们是唯一的)。但是,它每次都会更新所有以前更新的密钥。如果你有一本这样的字典

"John" = "apples";
"David" = "apples";
你把“约翰”改成了“香蕉”

然后将“David”更新为“oranges”,您将得到以下结果:

"John" = "oranges";
"David" = "oranges";
我已经把断点和NSLog都记录下来了,我发现在
setNote:forKey:
方法开始时,“John”变成了“oranges”,甚至在
[allNotes setObject:note forKey:key]
行被调用之前,这是我整个程序中唯一一个更改
allNotes
字典的地方,但不知何故,在调用函数之前,原始行正在被重新更改。第一次进行更改(“香蕉”轮)时,无论字典大小或正在更改哪个条目,所有内容都可以正常工作;第二次(“橘子”轮)时,所有内容都可以正常工作,除了更改先前更改的行

我不知道如何在我的代码中找到更准确的原因,因为在按下某个键的确切瞬间,
textDidChange:
被调用,此时第一个条目已经被更改。值得注意的是,当我停止应用程序并重新运行时,它会返回到正常更改第一个应用程序,然后重新开始整个过程

另一个奇怪的部分是,关键变量运行良好。我已经在调试器中进行了检查:全局变量
currentKey
和从中派生的局部变量
key
都将是“David”,但是这些更改将同时影响“David”和“John”,以及在“John”之前更改的任何其他变量。它怎么知道以前编辑过哪些行,而只使用当前的键值


诚然,我是一个可可初学者,但我完全被难倒了。有人能帮我解释一下吗?

当一个键/值对被添加到字典中时,键被复制,而值被保留。键被复制,因此它们不能被更改-字典的内部组织基于键

这些值将被保留,因为它们在字典中必须继续存在,但如果该值是可变类型,则可以对其进行变异。例如,如果您创建了
NSTextField
对象的字典,则键和
NSTextField
对象之间的关联是固定的,但单个文本字段本身的内容可以更改


在代码
[\u mainTextField string]
中,每次调用同一
NSMutableString
对象时,都会返回对该对象的引用。这意味着字典中的每一个值都是对同一个可变对象的引用,并给出您所看到的行为。您可以通过更改
[\u mainTextField string]
以通过复制内部使用的可变字符串返回
NSString
来解决此问题;或者使用
[[u mainTextField string]copy]
复制返回的内容。如果
[\u mainTextField string]
的目的是返回
\u mainTextField
的当前值的快照(无论其类型是什么-示例没有说明),则前者更好。

将键/值对添加到字典时,会复制键,同时保留值。键被复制,因此它们不能被更改-字典的内部组织基于键

这些值将被保留,因为它们在字典中必须继续存在,但如果该值是可变类型,则可以对其进行变异。例如,如果您创建了
NSTextField
对象的字典,则键和
NSTextField
对象之间的关联是固定的,但单个文本字段本身的内容可以更改


在代码
[\u mainTextField string]
中,每次调用同一
NSMutableString
对象时,都会返回对该对象的引用。这意味着字典中的每一个值都是对同一个可变对象的引用,并给出您所看到的行为。您可以通过更改
[\u mainTextField string]
以通过复制内部使用的可变字符串返回
NSString
来解决此问题;或者使用
[[u mainTextField string]copy]
复制返回的内容。如果
[\u mainTextField string]
的目的是返回
\u mainTextField
的当前值的快照(无论其类型是什么-示例中没有说明),则前者更好。

您太棒了!
[[[u mainTextField string]copy]
似乎正在工作。既然你说另一种方法更好,那么你能分享一段代码片段来说明前一种方法是如何实现的吗?这种“内部复制”的概念对我来说是全新的。我试图返回一个常规的
NSString
,当前内容为
\u mainTextField
,它是
NSScrollView中的
NSTextView
如果
\u mainTextField
NSTextView
的一个实例,那么您不能“在内部复制”,因为您不是类的作者
NSTextView
从其超类继承其
string
方法<
"John" = "oranges";
"David" = "oranges";