-1

我正在尝试制作一个简单的 iphone 应用程序,我一直在玩功能,最近,代表。我只是对内存管理感到困惑,因为显然“好代码”使我的应用程序因 exc_bad_access 而崩溃。

我有一个包含两个数据成员的对象,现在实现为空。

@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

2

用于release释放变量而不是调用dealloc变量,因此您遇到了问题 -

- (void)dealloc {

    [txtName release];
    [prompt release];
    [ok release];
    [cancel release];

    [super dealloc];
}
于 2012-06-06T04:53:58.937 回答
0

尝试写作

[txtName release];
[prompt release];
[ok release];
[cancel release];

而不是 dealloc,这些对象将被正确释放

于 2012-06-06T04:57:45.173 回答