当我的窗口关闭时,保存[NSTextField stringValue] ...变量被清除?

时间:2011-11-25 21:24:26

标签: objective-c macos cocoa

所以我从字段中获取用户名,将其保存在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被清除了吗?发生了什么? (我自己从不修改这个值。)

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

这是怎么回事?如何以安全的方式保存Textfield值以继续使用?

2 个答案:

答案 0 :(得分:3)

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

当你关闭窗口(并且它可能被释放)时,你分配给对象的NSString变量的字符串也是自动释放的。

您需要明确保留它。

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

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

或:

loggedInUser = [[usernameField stringValue] copy];

请勿忘记在调用loggedInUser方法时释放dealloc(假设您此处未使用ARC)。

答案 1 :(得分:1)

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

你提到当字符串死亡时变量“被清除”,但实际情况并非如此。变量未被清除,这是导致崩溃的原因:它仍然保存指向现在死对象的指针。使用strongcopy保持活动是一种解决方案,但如果迁移到ARC,则另一种选择是将属性声明为weak。然后,在Mac OS X 10.7及更高版本中,一旦字符串死亡,该属性将被清除(设置为nil)。