Dealloc和ARC

时间:2014-01-14 18:21:44

标签: objective-c memory-management automatic-ref-counting

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

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

MyClass mc;

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

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

//etc...

方法名称alloc是“allocate”的缩写,因为它是将内存分配给变量的方法。每次为其分配新值时,编译器是否会自动释放sc的内存?我计划在我的项目中使用此方法,并且我不希望在调用alloc的所有时间分配大量内存以将新值分配给mc

3 个答案:

答案 0 :(得分:5)

编译器从不调用dealloc。编译器根据需要插入retainreleaseautorelease(更有效的等价物),以遵循内存管理规则。

当编译器插入所述调用由编译器决定时,细节将在不同的编译器版本和不同的优化级别之间发生变化。

即。你不应该担心一般

然而,自动释放压力 仍然是一个问题,因为可以保留周期。因此,您绝对应该使用分配工具来调整您的应用,以测量高水位线,并确保您的应用不会随着时间的推移而泄漏内存。

答案 1 :(得分:0)

  

我读到在Xcode中使用ARC进行Objective-C编程时,会自动调用dealloc方法

在Objective-C中,无论您是否使用ARC,都不会直接致电-dealloc

  

在什么情况下被称为?

当对象的保留计数降至零时,将调用

-dealloc。也就是说,当之前声明对象“所有权”的所有对象(通过调用+alloc-retain-copy+new)放弃该所有权时,会调用它(通过致电-release-autorelease)。

  

每次为其分配新值时,编译器是否会自动释放sc的内存?

如果您正在使用ARC(并且您应该使用),编译器将向-retain-release等插入适当的调用,以便适当地管理内存。也就是说,您仍然需要了解内存管理的工作原理,并且您应该熟悉Advanced Memory Management Programming Guide中的材料。

答案 2 :(得分:0)

在ARC下,您的变量mc将一次只保留一个MyClass实例的强引用,因此当您分配第二个实例并将其分配给变量时,第一个应该被取消分配,假设您的doThis:方法不会创建另一个对该实例的强引用,或者您在代码中没有做任何其他您已省略的内容将保留强引用

话虽如此,您最好使用Instruments运行应用程序,以查看应用程序在此期间使用的内存量。你的实例不应该被自动释放,所以你不必担心它们会一直存在,直到自动释放池耗尽,但我不知道你在初始化一个类的实例时可能正在做什么,或者什么您可能正在使用doThis:方法进行操作,因此如果您担心,最好使用Instruments对内存分配和泄漏进行分析。