我正在尝试制作一个简单的iphone应用程序,我一直在玩功能和最近,代表。我只是对内存管理感到困惑,因为显然“很好的代码”让我的应用程序崩溃exc_bad_access。objective-c内存管理澄清
我有一个对象有两个数据成员,现在实现为空。
@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];
}
与包含在表格中的对象的deallocs注释掉,我的应用程序运行正常。然而,当我去掉它们,我收到EXC_BAD_ACCESS错误在我的委托协议:
// in main view controller
- (void) receiveSemester:(semester *)newSemester {
[test setText:newSemester.name];
// test is a UILabel
}
我尝试了僵尸的方法和它说,标签调用一个释放的对象。我不会在“form”控制器中释放我的学期对象,即使我是在取消分配视图之前调用委托函数。
显然我不应该在dealloc方法中释放对象,我只是不清楚为什么我不应该。
再次,在此先感谢您的帮助。
使用[txtName release]; [及时发布]; [确定发布]; [取消发布];而不是dealloc,你也可以使用ARC自动引用计数.....与ARC你不需要使用dealloc,release,它会自动释放内存....并且你在开始时选择它,当你创建一个新的项目,您还可以通过编辑在ARC中更改您的项目。 – TheTiger
对不起,我找不到ARC选项,它在哪里? – gamda
当你创建一个新的项目 - 并在你给你的项目名称的窗口..见下面有一个选项 - “使用自动引用计数”只是选中此框...然后按下.. – TheTiger