2014-01-14 64 views
0

我读到,当在Xcode中使用Objective-C编程中的ARC时,编译器会自动调用dealloc方法。它在什么情况下被称为?Dealloc和ARC

为了避免变量名太多,当我需要重复使用相同的类来执行多个操作(并且每次重置变量)时,我经常声明变量,将它们设置为nil,然后分配值给他们,我走了。这最终看起来像这样:

MyClass mc; 

mc = [[MyClass alloc] init]; 
[mc doThis:someOption] 

mc = [[MyClass alloc] init]; 
[mc doThis:someOtherOption]; 

//etc... 

方法名alloc是短期的“分配”因为它是内存分配给该变量的方法。每次我为它分配一个新值时,编译器是否会自动释放内存为sc?我打算在我的一个项目中使用这种方法,并且我不希望分配很多内存,我一直呼叫allocmc分配一个新值。

回答

5

编译器从不调用dealloc。编译器根据内存管理规则插入retainreleaseautorelease(实际上更有效)。

当编译器插入所述调用取决于编译器,细节将在不同的编译器版本和不同的优化级别上发生变化。

I.e.你应该不需要担心它一般

但是,autorelease压力可以仍然是一个问题,因为可以保留周期。因此,您应该明确地使用分配工具来讨论您的应用程序,以测量高水位标记并确保您的应用程序不会随着时间的推移而泄漏内存。

+0

感谢您的提示。我检查了仪器;有没有办法在仪器中运行我的项目而不导出?看来,仪器只记录应用程序(.app)的信息,但我的项目还没有准备好。 – Arc676

+0

在Xcode中,从产品菜单中选择配置文件。 –

+0

为什么没有在编译器中进行优化,它将取得最内层作用域中的对象的所有权,将对象从autorelease池中移除,并在作用域结束时释放它?一段时间以来,我认为有这样的优化,但唉,我错了。 –

0

我读到,在Xcode中的Objective-C编程使用ARC时dealloc方法被自动

在Objective-C调用,你永远不会调用-dealloc直接您是否正在使用ARC。

在什么情况下它被称为?

-dealloc当对象的保留计数下降到零时被调用。也就是说,当所有先前声明对象“所有权”的对象(通过调用+alloc-retain-copy+new)已经放弃该所有权时(通过调用-release-autorelease),它被调用。

编译器会在每次给它赋一个新值时自动释放sc的内存吗?

如果您正在使用ARC(你应该是),使内存是适当的管理,编译器会插入适当的呼叫-retain-release等。也就是说,你仍然需要了解内存管理是如何工作的,你应该熟悉Advanced Memory Management Programming Guide中的材料。

+0

我认为当你使用ARC时,你不会调用'release'或'autorealease'。我需要知道即使'release'从不被调用,内存是否会被释放。 – Arc676

+1

正确 - 使用ARC,您不会调用'-release'或'-autorelease'。正如我上面所说的,bbum表示甚至更好,编译器会为您插入这些调用。 – Caleb

0

根据ARC,您的变量mc将在同一时间举行的强引用的MyClass只有一个实例,所以当你分配第二个,并将其分配给变量,第一个应该得到释放,假设你doThis:方法不会做任何事情,将创建另一个强有力的参考,或者你没有做你的代码中的任何其他部分,你会省略,这将保持强大的参考。这就是说,如果你使用Instruments运行你的应用程序来查看你的应用程序在此期间使用了多少内存,那将是一个不错的主意。你的实例不应该被自动释放,所以你不应该担心它们会一直存在,直到自动释放池被耗尽,但是我不知道你在初始化类的一个实例时可能会做什么,或者什么您可能正在使用doThis:方法,所以如果您担心,将内存分配和泄漏分析仪器始终是个好主意。