2012-03-15 76 views
1

什么时候我必须释放在.h文件中声明并在我的.m文件中分配的对象viewdidload?自动释放给我一个错误。我是否必须在iOS:何时释放成员对象?

中发布它们
-(void)dealloc{ 

} 

方法(如属性)?

THX

+0

我的事情你是不是obj是否分配内存。 – 2012-03-15 12:23:48

+0

如果你使用alloc,mutableCopy,new,copy来分配内存。然后你释放。 – 2012-03-15 12:26:05

回答

4

首先,添加[超级的dealloc],这一点很重要:

-(void)dealloc{ 
    [var1 release], var1 = nil; 
    [var2 release], var2 = nil; 
    [super dealloc]; 
} 

其次,是的,你已经保留的实例变量必须由您手动释放。

+0

是[super dealloc] |总是dealloc方法中的最后一个语句?永远不要将它看作第一个.. – user944351 2012-03-15 12:31:00

+0

绝不,永远不要把它放在你的dealloc方法的中间或开始。你的子类变量可能严重依赖于超类变量,所以为了安全起见,子类必须首先被释放。在开始的时候使用简单的子类[super dealloc]可以工作,但我建议你习惯在方法的末尾写下它 - 使代码易于扩展并且看起来更专业。另请注意,如果您省略[super dealloc],应用程序不会崩溃,但会产生内存泄漏。 – 2012-03-15 12:37:28

+0

非常感谢你的努力! – user944351 2012-03-15 12:46:04

2

如果您使用ARC(在Xcode的最新版本的默认设置),然后保留/释放可自动插入,你只需要担心的对象图(保持引用,当您需要使用一个对象,并避免循环引用)。

如果不是,你是正确的,dealloc是释放成员变量的正确的地方。尽管专门为在viewDidLoad中创建的那些,请记住,您的视图可能会在控制器的生命周期内多次加载/卸载,因此请考虑使用viewDidUnload来释放这些对象。

0

如果您使用ARC(自动引用计数),你不知道。这是为你自动完成的。如果你不使用ARC,那么你可以像正常一样在dealloc中手动执行它。请注意,新项目将自动使用ARC,如果您尝试使用release,retainautorelease和对象,ARC会给您一个错误。

+0

不,我不使用弧,因为外部库不支持这个。 – user944351 2012-03-15 12:32:24

0

是的,你会在一般的释放他们在dealloc。而且,如果他们在viewDidLoad正在创建的,那么你可能要释放他们(和伊娃设置为nil)在viewDidUnload,特别是如果该对象可以在当前状态下一次viewDidLoad被称为重建。

当然,如果你使用ARC那么你并不需要显式释放你高德在dealloc作为ARC会产生dealloc实现它可以实现这个要求。

+0

我是否总是要释放和无对象? – user944351 2012-03-15 12:38:09

+0

在'viewDidUnload'中,肯定是。在'dealloc'中,这取决于。它不会伤害他们,但你可以在这里读到更多的问题:-)。 – mattjgalloway 2012-03-15 16:04:44