2012-06-06 58 views
-1

我正在尝试制作一个简单的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方法中释放对象,我只是不清楚为什么我不应该。

再次,在此先感谢您的帮助。

+0

使用[txtName release]; [及时发布]; [确定发布]; [取消发布];而不是dealloc,你也可以使用ARC自动引用计数.....与ARC你不需要使用dealloc,release,它会自动释放内存....并且你在开始时选择它,当你创建一个新的项目,您还可以通过编辑在ARC中更改您的项目。 – TheTiger

+0

对不起,我找不到ARC选项,它在哪里? – gamda

+0

当你创建一个新的项目 - 并在你给你的项目名称的窗口..见下面有一个选项 - “使用自动引用计数”只是选中此框...然后按下.. – TheTiger

回答

2

使用release释放,而不是在变量调用dealloc变量,由于这个你有问题 -

- (void)dealloc { 

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

    [super dealloc]; 
} 
+0

完美!发布不会让应用崩溃了。但我仍然不清楚。 dealloc和release有什么区别?并释放一切正确的方式来避免内存泄漏? – gamda

+0

请在编写任何代码之前,[阅读文档](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/ UID/20000994-BAJHFBGH)。 –

+0

@ gamda-你需要检查基本内存管理的文档 - https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/ UID/20000994-BAJHFBGH – rishi

0

尝试写

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

代替的dealloc和这些对象将被释放正确