Objective c 在NSUserDefaults中保存字符串失败,除非保留它

Objective c 在NSUserDefaults中保存字符串失败,除非保留它,objective-c,nsuserdefaults,retain,Objective C,Nsuserdefaults,Retain,我是objective-c的新手。 我在从UITextField保存字符串时遇到问题 我在属性中声明了一个字符串,并将其合成为“familyName”,以存储用户的姓氏。 然后我想在用户按下按钮时保存familyName -(IBAction)textFieldDidBeginEditing:(UITextField *)textField; {} -(BOOL)textFieldShouldReturn:(UITextField *)textField{ familyName = input

我是objective-c的新手。 我在从UITextField保存字符串时遇到问题

我在属性中声明了一个字符串,并将其合成为“familyName”,以存储用户的姓氏。 然后我想在用户按下按钮时保存familyName

-(IBAction)textFieldDidBeginEditing:(UITextField *)textField;
{}

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
familyName = inputFamilyName.text;  
NSLog(@"the user's family name is %@", familyName); //it works here.

if (inputFamilyName == textField) {
    [inputFamilyName resignFirstResponder];
}
return YES;
}

-(IBAction)goToNameWheel:(id)sender{

NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:familyName forKey:@"family"];
[userDefault synchronize];
}
它在运行保存代码时崩溃,它说“线程1:EXC\u BAD\u访问(代码=1,地址=0x……”

之后,我尝试另一个测试,看看familyName会发生什么,然后我写道:

-(IBAction)test:(id)sender{
NSLog(@"1.the family name is %@", inputFamilyName.text); // This works...
NSLog(@"2.the family name is %@", familyName);} // This crashes...
最后…我尝试在textFieldDidBeginEditing中保留familyName:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
familyName = inputFamilyName.text;  
NSLog(@"the user's family name is %@", familyName); //it works here.

if (inputFamilyName == textField) {
    [inputFamilyName resignFirstResponder];
}
[familyName retain]; // just added randomly...
return YES;
}
然后一切正常,我可以保存家庭名称,打印它…等等。。 我的问题是…这里到底发生了什么,为什么我必须保留它?我的原始代码有什么问题吗? 谢谢你的时间!

当你这么做的时候

familyName = inputFamilyName.text; 
您实际上没有使用属性。您使用的实例变量与属性同名,但没有内存管理功能

你应该做的是

self.familyName = inputFamilyName.text; 
然后属性的保留将生效,您不必手动保留

为了更难犯错误,您可以将
@synthesis
语句更改为:

@synthesize familyName = _familyName;
如果这样做,则意味着名为
familyName
的属性将有一个名为
\u familyName
的实例变量作为它的后盾-这意味着很难意外键入错误的属性,从而避免了此错误