-1

私は単純な iPhone アプリを作成しようとしています。私は機能と最近デリゲートをいじっています。どうやら「良いコード」がexc_bad_accessでアプリをクラッシュさせるため、メモリ管理に関して混乱しています。

今のところ、2 つのデータ メンバーと空の実装を持つオブジェクトがあります。

@implementation semester: NSObject{
    NSInteger ID;
    NSString *name;
}

次に、私のデリゲートメソッド:

- (void) receiveSemester:(semester *)newSemester {
[test setText:newSemester.name];
}

そして、以下を持つフォームとして使用されるビュー:

@interface addSemesterController : UIViewController {
id<ModalViewDelegate> delegate;
UITextField *txtName;
UILabel *prompt;
UIButton *ok;
UIButton *cancel;
}

すべてのオブジェクトがプロパティになり、アプリケーション ファイルに合成されます。デリゲートを使用したメソッドは次のとおりです。

- (IBAction) okClick:(id)sender{
// create semester object and return it
semester *created = [[semester alloc] init];
created.name = txtName.text;
[delegate receiveSemester:created];

    [self dismissModalViewControllerAnimated:YES];
}

私の dealloc メソッドは次のようになります。

- (void)dealloc {
/*
[txtName dealloc];
[prompt dealloc];
[ok dealloc];
[cancel dealloc];
 */
    [super dealloc];
}

フォームに含まれるオブジェクトの割り当て解除をコメントアウトすると、アプリは正常に動作します。ただし、それらのコメントを外すと、デリゲート プロトコルで exc_bad_access エラーが発生します。

// in main view controller
- (void) receiveSemester:(semester *)newSemester {
[test setText:newSemester.name];
    // test is a UILabel
}

ゾンビ メソッドを試してみたところ、ラベルがリリースされたオブジェクトを呼び出していると表示されます。「フォーム」コントローラーでセメスターオブジェクトを解放していません。ビューの割り当てを解除する前にデリゲート関数が呼び出されたとしても。

明らかに、dealloc メソッドでオブジェクトを解放するべきではありません。そうすべきでない理由がよくわかりません。

繰り返しますが、助けてくれてありがとう。

4

2 に答える 2