Objective-C正确的内存管理和ARC清理

Objective-C正确的内存管理和ARC清理,objective-c,memory-management,automatic-ref-counting,Objective C,Memory Management,Automatic Ref Counting,来自托管内存世界,想知道使用ARC清理对象的正确方法是什么 例如:如果在C中声明一个实例变量,.NET将允许GC在离开作用域方法/循环体后提取它,等等 在Objective-C中,什么是正确的清理方法?只需将引用/指针设置为nil或调用dealloc,或者在执行离开作用域并为您执行任务后,将检测到没有外部引用指向实例 ARC是否会检测到没有外部参照指向 实例,一旦执行离开范围并为您完成任务 基本上,是的,ARC就是这么做的。使用ARC时,不需要清理对象;事实上,您不能因为它而停止尝试执行手动内存

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

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

在Objective-C中,什么是正确的清理方法?只需将引用/指针设置为nil或调用dealloc,或者在执行离开作用域并为您执行任务后,将检测到没有外部引用指向实例

ARC是否会检测到没有外部参照指向 实例,一旦执行离开范围并为您完成任务

基本上,是的,ARC就是这么做的。使用ARC时,不需要清理对象;事实上,您不能因为它而停止尝试执行手动内存管理

您可能希望参考我书中的相关讨论:

它解释了幕后真正发生的事情,内存是如何实际管理的,然后描述了ARC是如何屏蔽大部分内存的


请注意,正如我在上面引用的URL中所解释的,它主要不是通过垃圾收集这样的方式来完成的:它是通过在代码中插入不可见的显式内存管理来完成的。

ARC意味着自动引用计数,只是让编译器为您添加retain/release/autorelease调用的一种方式。它与GC不一样,但在大多数情况下,您可以认为对象生存期是为您自动管理的,例如在GC中。 如果你想要更多的信息,你应该阅读


最后一点:不要自己打电话给dealloc。dealloc是对象的终结器,一旦ObjC运行时确定对象引用计数已达到0,将调用该终结器。此方法只能由子类重写。在ARC模式下,您通常不需要这样做,除非您的对象引用非对象IVAR,而这些IVAR需要在对象本身完成后完成。

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

您也可以禁用ARC,在Xcode界面中,转到主项目而不是主项目。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;
}
只需分配然后初始化,您不需要做任何其他事情

请记住getter和setter。

将对-alloc和-init的调用分开是一个坏习惯和危险习惯。