2010-06-05 66 views
0

我正在开发一个iPhone应用程序,而且我对iPhone开发非常新颖。对我的自定义目标Dealloc-C

我创建了一些带有实例变量(NSArray,NSString等)的自定义类。所有类都从NSObject继承。

我应该创建一个dealloc方法来释放所有实例变量吗?

谢谢。

+0

这是一个普遍的问题。我正在安装像NSArray和NSString的对象,我想我必须释放它们。但我看到一些示例代码,这些实例变量未被释放。 – VansFannel 2010-06-05 16:43:54

回答

3

是的,如果你保持实例变量是对象,你肯定需要一个dealloc。您也可能需要保留或复制这些内容,具体取决于您的对象如何创建/使用它们。

检查出内存管理this article。我认为它解释得很好。您还必须阅读Memory Management Programming Guide for Cocoa。即使你没有完全理解所有的东西,阅读整篇文章,然后阅读文章,然后做一些工作,得到一些崩溃,并再次阅读它:)最终它应该点击。

+0

不是,不。 '保持实例变量是对象'的任何内容都不意味着你有一个dealloc方法。 – hooleyhoop 2010-06-06 00:03:24

+0

@mustISignUp:除非他们被简单分配或者所有的单身人士,否则你会。由于对象作为实例变量应该被分配(例如委托)和对单例的引用是极少数情况,那么是的,你必须有一个dealloc方法。我的措辞可能有点过于强硬,但初学者应该习惯于编写适当的拆卸方法。 – 2010-06-06 03:14:35

+0

这是误导。这听起来像dealloc方法是特殊的 - 它不是。 – hooleyhoop 2010-06-06 07:54:41

0

在iPhone开发中,由于没有垃圾收集,所以它的SOP非常多,有一个dealloc。

0

您必须发布您的课程拥有所有权的任何对象。这意味着,是的,你必须覆盖dealloc方法并释放那里的对象。

通常情况下,您对实例变量中的值(对象)拥有所有权,但它也取决于您自己创建的

你一定要阅读Memory Management Programming Guide,当你获得所有权时,它会很好地描述。

+0

你不必发布和反对你的课程拥有所有权(这甚至不意味着什么)。如果你想释放一个对象,你肯定不需要通过覆盖(sic)dealloc来完成它。 – hooleyhoop 2010-06-06 00:09:16

+0

@mustISignUp:你说得对,我的措辞不好。当然,你可以随时释放一个对象。但我仍然认为如果您拥有所有权,您必须释放它,这意味着您保留了该对象(因此增加了保留计数)。除了垃圾收集(iPhone上不存在),否则保留计数如何减少? – 2010-06-06 01:53:02

0

是的,拥有dealloc方法通常是最好的方法。

如果你想回收你的实例变量使用的内存,你将不得不在他们完成后释放它们。您可以添加的方法来做到这一点清理: -

- (void)cleanUp { 
    [myArray release]; 
    [myString release]; 
} 

调用它,当你不再需要的实例。

现在,当你想释放这些变量的时间点是他们的父对象被销毁的时间点(父对象不见了,所以不再需要实例变量)。因为-dealloc会在父对象将被销毁时自动调用 - 将cleanup代码放在dealloc中比在我们必须在正确的时间调用的-cleanup方法更有意义。

如果你不想重用内存,例如。如果你是永远不会将完成实例变量,那么你不需要释放它们,并且可能不需要-dealloc。

+0

..你想要将这些实例变量设置为'nil',否则当真正的dealloc被调用时,你会双重释放它们。 – Jason 2010-06-05 17:09:30

+0

errrrrrr,它更多的是不做的例子! – hooleyhoop 2010-06-05 17:18:50