0

私は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(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を保存して、印刷することができます。私の質問は...ここで正確に何が起こるのか、なぜそれを保持する必要があるのですか?元のコードに何か問題がありますか?あなたの時間のためのThx!

4

1 に答える 1

2

あなたがするとき

familyName = inputFamilyName.text; 

実際にはプロパティを使用していません。プロパティと同じ名前のインスタンス変数を使用していますが、メモリ管理機能はありません。

あなたがすべきことは

self.familyName = inputFamilyName.text; 

その後、プロパティの保持が開始され、手動で保持する必要がなくなります。

間違いを犯しにくくするために、@synthesizeステートメントを次のように変更できます。

@synthesize familyName = _familyName;

これを行うと、呼び出されたプロパティに、それをバックアップするfamilyNameというインスタンス変数が含まれる_familyNameことを意味します。つまり、誤って間違ったものを誤って入力することが非常に難しくなり、この間違いを回避できます。

于 2012-07-23T12:09:09.727 に答える