1

来自托管内存的世界,想知道在使用 ARC 时清理对象的正确方法是什么。

例如:如果在 C# 中声明一个实例变量,.NET 将允许 GC 在它离开作用域(方法/循环体等)后拾取它

在 Objective-C 中清理的正确方法是什么?只需将引用/指针设置为 nil 或调用 dealloc 或者一旦执行离开范围并为您完成工作,ARC 是否会检测到没有外部引用指向实例?

4

3 回答 3

1

一旦执行离开范围并为您完成工作,ARC是否会检测到没有外部引用指向实例

基本上,是的,这正是 ARC 要做的。使用 ARC 时不需要清理对象;事实上,您不能(它会阻止您尝试执行手动内存管理)。

您可能想查阅我书中的相关讨论:

http://www.aeth.com/iOSBook/ch12.html#_memory_management

它解释了幕后真正发生的事情(实际上是如何管理内存的),然后继续描述 ARC 如何保护您免受其中大部分的影响。

请注意(正如我在上面引用的 URL 中解释的那样),它主要不是由垃圾收集之类的东西完成的:它是通过在整个代码中插入不可见的显式内存管理来完成的。

于 2012-09-06T18:30:24.093 回答
1

ARC 的意思是“自动引用计数”,它只是让编译器为您添加对// 的调用的一种retain方式。它与 GC 不同,但在大多数情况下,您可以考虑自动为您管理对象的生命周期,就像在 GC 中一样。releaseautorelease

如果您想了解更多信息,您应该阅读ARC 上的 LLVM 文档

最后一点:永远不要给dealloc自己打电话。dealloc是对象的终结器,一旦 ObjC 运行时确定对象引用计数已达到 0,就会调用它。此方法仅意味着被子类覆盖。在 ARC 模式下,您通常不需要这样做,除非您的对象引用了在对象本身完成后需要完成的非对象 ivars。

于 2012-09-06T18:34:27.627 回答
0

好吧,在过去,iOS 程序员负责通过向对象发送释放消息来告诉系统他们何时使用了他们分配的对象。这是根据称为手动引用计数的内存管理系统完成的。从 Xcode 4.2 开始,程序员不再需要担心这一点,并且可以依靠系统来处理必要的内存释放。这是通过称为自动引用计数或简称 ARC 的机制完成的。当您使用 Xcode 4.2 或更高版本编译新应用程序时,ARC 默认启用。

您还可以禁用 ARC,在您的 Xcode 界面中,转到您的主项目(不是 main.h)您的实际 Xcode 项目,然后选择它,您应该会在 Xcode 中看到一个显示项目设置的窗口,会有一个如果您来自数据管理和内存领域你说过,但请记住,你会更容易保持更新到 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;
}

只需分配然后初始化,你不需要做任何其他事情。

请记住 getter 和 setter。

于 2012-09-06T21:32:52.143 回答