来自托管内存的世界,想知道在使用ARC时清理对象的正确方法是什么。
例如:如果在C#中声明一个实例变量,.NET将允许GC在离开作用域(方法/循环体等)时将其拾取
在Objective-C中清理的正确方法是什么?只需将引用/指针设置为nil或调用dealloc,或者一旦执行离开范围并为您完成工作,ARC是否会检测到没有外部引用指向实例?
答案 0 :(得分:1)
ARC将检测到没有外部引用指向 实例一旦执行离开范围并为您完成工作
基本上,是的,这正是ARC将要做的事情。使用ARC时无需清理对象;事实上,你不能(它阻止你尝试执行手动内存管理)。
您可能需要参考我的书中的相关讨论:
http://www.apeth.com/iOSBook/ch12.html#_memory_management
它解释了幕后真正发生的事情(如何实际管理内存),然后继续描述ARC如何屏蔽你的大部分内容。
请注意(正如我在上面引用的URL中解释的那样)它主要不是通过垃圾收集之类的东西完成的:它是通过在整个代码中插入不可见的显式内存管理来完成的。
答案 1 :(得分:1)
ARC表示“自动引用计数”,只是让编译器为您添加对retain
/ release
/ autorelease
的调用的方法。它与GC不同,但在大多数情况下,您可以考虑自动管理对象的生命周期,就像在GC中一样。
如果您想了解更多信息,请阅读LLVM document on ARC
最后注意:永远不要自己致电dealloc
。 dealloc
是对象的终结器,一旦ObjC运行时确定对象引用计数已达到0,就会调用该方法。此方法仅用于被子类覆盖。在ARC模式下,您通常不需要这样做,除非您的对象引用了在对象本身完成后需要最终确定的非对象ivars。
答案 2 :(得分:0)
好吧,在过去,iOS程序员负责通过向对象发送释放消息来告诉系统何时使用他们分配的对象。这是根据称为手动引用计数的存储器管理系统完成的。从Xcode 4.2开始,程序员不再需要担心这一点,并且可以依赖系统来根据需要释放内存。这是通过称为自动参考计数(简称ARC)的机制完成的。使用Xcode 4.2或更高版本编译新应用程序时,默认情况下会启用ARC。
您也可以在Xcode界面中禁用ARC,转到您的主项目(而不是main.h)您的实际Xcode项目,然后选择它,您应该在Xcode中看到一个窗口,显示项目的设置,那里将是一个“Objective-C自动参考计数”并将其设置为“是”,将其停用(为“否”),如果您来自数据管理领域,您不应该担心ARC和你所说的内存一样,但请记住,你更容易更新到iOS新功能系统,这对程序员来说更容易编程,它只会让我们的生活更轻松。
现在,使用ARC“在Xcode中清理'的正确方法是使用'alloc'和'init'。
使用Xcode中的ARC,你不需要担心“清理”这是Xcode现在的工作,你只需要:
1)创建一个变量。
2)分配。
3)初始化。
就是这样。
这里有一个例子:
int main (int argc, char * argv[])
{
@autoreleasepool {
Variable *myVariable;
// Create an instance of a Variable and initialize it
myVariable = [Variable alloc];
myVariable = [myVariable init];
// Set variable to 4/20
[myVariable setNumerator: 4];
[myVariable setDenominator: 20];
// Display the variable using the print method
NSLog (@"The value of myVariable is:");
[myVariable print];
}
return 0;
}
只需分配然后初始化,你不需要做任何其他事情。
记住吸气者和制定者。