在保留它之前,无法在NSUserDefaults中保存字符串

时间:2012-07-23 11:59:16

标签: objective-c nsuserdefaults retain

我是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_BAD_ACCESS(代码= 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,打印它..等等.. 我的问题是......这里到底发生了什么,为什么我要保留它?我的原始代码有什么问题吗? 感谢你的时间!

1 个答案:

答案 0 :(得分:2)

当你这样做时

familyName = inputFamilyName.text; 

你实际上并没有使用这个属性。您正在使用与您的属性具有相同名称的实例变量,但没有内存管理功能。

你应该做的是

self.familyName = inputFamilyName.text; 

然后该属性的保留将启动,您不必手动保留。

为了更加难以理解,您可以将@synthesize声明更改为:

@synthesize familyName = _familyName;

如果你这样做,那么这意味着名为familyName的属性将有一个名为_familyName的实例变量支持它 - 这意味着不小心意外地输入了错误的实例变量,从而避免了这个错误。