变化神秘地改变了

时间:2011-05-15 05:54:20

标签: objective-c cocoa

所以,这是我之前的问题的后续内容。我遇到了一个奇怪的错误,无法弄清楚什么是错的。基本上,我编写了以下代码来检测何时在文本框中输入文本,并相应地更改变量:

-(void)controlTextDidChange:(NSNotification *)aNotification
{
    NSTextView *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];

    if ([[aNotification object] isEqualTo:[self idField]])
    {

        [self setIdNumber:[[fieldEditor textStorage] string]];
    }
    else if ([[aNotification object] isEqualTo:[self chapterField]])
    {

        [self setChapterNumber:[[fieldEditor textStorage] string]];

    }

}

这将获取输入的文本,检查正在编辑的文本框,并根据编辑的框更改变量。问题是“else if ...”代码块将变量chapterNumber和IdNumber都更改为输入的文本,即使只有更改chapterNumber的代码。我只是想不清楚什么是错的......

1 个答案:

答案 0 :(得分:1)

您遇到此问题是因为您的两个setter方法setIdNumber:setChapterNumber:没有复制字段编辑器中的字符串,只是指向它。

正如您所知,字段编辑器是一个NSTextView,它可以被当前正在关注的文本字段重用。它始终是同一个对象,并且该对象的string会根据其附加的文本字段而改变。

将变量分配给字段编辑器的string时,您将分配指针;您现在分配的任何变量都包含该字符串的地址。由于字段编辑器始终是同一个对象,因此即使内容发生更改,字符串的地址也会保持不变,因此您拥有的任何指针(您为该字符串指定的任何变量)都将更改其值。

如果使用字段编辑器字符串的内容创建 new 字符串,使用copystringWithString:或其他方式,则你得到一个新的对象,在一个地址编辑器不能改变的地址,你分配给这个副本的每个变量将继续在复制的字符串中产生值,无论字段编辑器发生什么。