【问题标题】:Fail to save a string in NSUserDefaults not until retain it无法在 NSUserDefaults 中保存字符串,直到保留它
【发布时间】:2012-07-23 11:59:16
【问题描述】:

我是 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];
}

运行保存代码时崩溃,提示“Thread 1:EXC_BAD_ACCESS (code=1, address = 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,打印它......等等。 我的问题是......这里到底发生了什么,为什么我必须保留它?我的原始代码有什么问题吗? 谢谢你的时间!

【问题讨论】:

    标签: objective-c nsuserdefaults retain


    【解决方案1】:

    当你这样做时

    familyName = inputFamilyName.text; 
    

    您实际上并未使用该属性。您正在使用与您的属性同名的实例变量,但没有内存管理。

    你应该做的是

    self.familyName = inputFamilyName.text; 
    

    然后属性的retain就会启动,你就不用手动retain了。

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

    @synthesize familyName = _familyName;
    

    如果你这样做,则意味着名为familyName 的属性将有一个名为_familyName 的实例变量支持它——这意味着意外键入错误的变量要困难得多,从而避免了这个错误。

    【讨论】:

      猜你喜欢
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      相关资源
      最近更新 更多