Objective c 正在保存[NSTextField stringValue]。。。我的窗口关闭时是否清除变量?

Objective c 正在保存[NSTextField stringValue]。。。我的窗口关闭时是否清除变量?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,因此,我从字段中获取用户名,并将其保存在NSString变量中: loggedInUser = [usernameField stringValue]; [loginWindow close]; 稍后,我尝试访问loggedInUser数据: NSLog(@"Logged in User:%@", loggedInUser); 这通常(但并非总是)会产生错误: Program received signal: "EXC_BAD_ACCESS". // Summ

因此,我从字段中获取用户名,并将其保存在NSString变量中:

    loggedInUser = [usernameField stringValue];
    [loginWindow close];
稍后,我尝试访问
loggedInUser
数据:

    NSLog(@"Logged in User:%@", loggedInUser);
这通常(但并非总是)会产生错误:

    Program received signal: "EXC_BAD_ACCESS". // Summary displays "{...}" for the value
loggedInUser
NSString是否被清除?怎么搞的?(我自己从不修改此值)

我唯一的想法是,我以某种方式将NSTextField的连续值保存在NSString中。然后,当我关闭窗口时,该值被清除


这就是发生的事吗?如何以安全的方式保存文本字段值以供继续使用?

啊,我刚刚意识到发生了什么

当关闭窗口时(很可能会被释放),分配给对象的NSString变量的字符串也会自动释放

您需要明确地保留它

或者,更重要的是,这样做:

loggedInUser = [[NSString alloc] initWithString: [usernameField stringValue]];
或:


当调用
dealloc
方法时,不要忘记释放
loggedInUser
(假设这里没有使用ARC)。

Ahhh,我刚刚意识到发生了什么

当关闭窗口时(很可能会被释放),分配给对象的NSString变量的字符串也会自动释放

您需要明确地保留它

或者,更重要的是,这样做:

loggedInUser = [[NSString alloc] initWithString: [usernameField stringValue]];
或:


当调用
dealloc
方法时,不要忘记释放
loggedInUser

另一种解决方案是将字符串存储在属性中,而不是实例变量中。您可以将属性声明为
strong
(或
retain
)或
copy
,然后您将拥有该字符串(或其副本)


您提到当字符串终止时变量“被清除”,但事实并非如此。变量未被清除,这是导致崩溃的原因:它仍然保持指向一个现已死亡对象的指针。使用
strong
copy
使其保持活动状态是一种解决方案,但如果迁移到ARC,另一种选择是将属性声明为
weak
。然后,在Mac OS X 10.7及更高版本上,字符串一消失,属性就会被清除(设置为
nil

另一种解决方案是将字符串存储在属性中,而不是实例变量中。您可以将属性声明为
strong
(或
retain
)或
copy
,然后您将拥有该字符串(或其副本)


您提到当字符串终止时变量“被清除”,但事实并非如此。变量未被清除,这是导致崩溃的原因:它仍然保持指向一个现已死亡对象的指针。使用
strong
copy
使其保持活动状态是一种解决方案,但如果迁移到ARC,另一种选择是将属性声明为
weak
。然后,在Mac OS X 10.7及更高版本上,一旦字符串消失,属性将被清除(设置为
nil
)。

如果您谈论的是NSTextFields,为什么要用cocoa touch和ios标记对其进行标记?创建并显示窗口时,返回什么?我怀疑您的窗口(及其内容)在您关闭后立即被释放。@MichaelDautermann,为什么
isReleasedWhenClosed
属性很重要?我想这就是这个问题的重点。我正在将用户名文本数据保存到全局(这是正确的术语吗?)NSString中。那么,在我把它保存在那里之后,为什么我对原始角色所做的一切都很重要呢?@cksubs:他在评论中回答了这个问题。如果启用了
releasedWhenClosed
,则当您关闭窗口时,它会自动释放。当窗口被解除分配时,它会释放其内容视图,从而释放其所有子视图,等等-因此最终文本字段会被释放,因此如果您自己不拥有该字符串,则该字符串将从您的下方消失。这就是“坏访问”:您正在尝试处理一个死对象。如果您正在谈论NSTextFields,为什么要用cocoa touch和ios标记此字段?当您创建并显示窗口时,返回什么?我怀疑您的窗口(及其内容)在您关闭后立即被释放。@MichaelDautermann,为什么
isReleasedWhenClosed
属性很重要?我想这就是这个问题的重点。我正在将用户名文本数据保存到全局(这是正确的术语吗?)NSString中。那么,在我把它保存在那里之后,为什么我对原始角色所做的一切都很重要呢?@cksubs:他在评论中回答了这个问题。如果启用了
releasedWhenClosed
,则当您关闭窗口时,它会自动释放。当窗口被解除分配时,它会释放其内容视图,从而释放其所有子视图,等等-因此最终文本字段会被释放,因此如果您自己不拥有该字符串,则该字符串将从您的下方消失。这就是“坏访问”:你试图使用一个死对象。