所以我从字段中获取用户名,将其保存在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值以继续使用?
答案 0 :(得分:3)
啊,我刚刚意识到发生了什么。
当你关闭窗口(并且它可能被释放)时,你分配给对象的NSString变量的字符串也是自动释放的。
您需要明确保留它。
或者,更重要的是,这样做:
loggedInUser = [[NSString alloc] initWithString: [usernameField stringValue]];
或:
loggedInUser = [[usernameField stringValue] copy];
请勿忘记在调用loggedInUser
方法时释放dealloc
(假设您此处未使用ARC)。
答案 1 :(得分:1)
另一种解决方案是将字符串存储在属性而不是实例变量中。您可以将该属性声明为strong
(或retain
)或copy
,然后您将拥有该字符串(或其副本)。
你提到当字符串死亡时变量“被清除”,但实际情况并非如此。变量未被清除,这是导致崩溃的原因:它仍然保存指向现在死对象的指针。使用strong
或copy
保持活动是一种解决方案,但如果迁移到ARC,则另一种选择是将属性声明为weak
。然后,在Mac OS X 10.7及更高版本中,一旦字符串死亡,该属性将被清除(设置为nil
)。