2012-07-23 101 views
0

我是objective-c中的新手。 我在保存UITextField中的字符串时遇到了问题。无法在NSUserDefaults中保存字符串,直到保留字符串

我在属性中声明了一个字符串,并将其命名为“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... 

最后......我尽力挽留familyName在textFieldDidBeginEditing:

-(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,打印它..等.. 我的问题是......这里究竟发生了什么,为什么我必须保留它?任何与我的原始代码错误? Thx为您的时间!

回答

2

当你

familyName = inputFamilyName.text; 

你没有实际使用属性做。你正在使用一个与你的属性同名的实例变量,但没有内存管理的东西。

你应该做的是

self.familyName = inputFamilyName.text; 

则该属性的保留会踢,你就不必手动保留。

使其更难犯的错误,你可以改变你的@synthesize说法是:

@synthesize familyName = _familyName; 

如果你这样做,那么就意味着所谓familyName的属性将有一个名为_familyName后盾的实例变量它意味着意外地错误地输入错误很难,从而避免了这个错误。

+0

Thx为您的快速响应。 它确实有效!我现在明白了! – Walter 2012-07-23 13:19:59