Objective c ARC中的内存管理

Objective c ARC中的内存管理,objective-c,memory-management,automatic-ref-counting,Objective C,Memory Management,Automatic Ref Counting,我无法理解这些物体是如何在弧形中释放的,这对我来说仍然是一个困惑 假设我在一个方法中使用alloc创建一个视图控制器或任何其他控件 -(void) displayView { RegViewController *sampleView = [[RegViewController alloc] init]; [sampleView setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];

我无法理解这些物体是如何在弧形中释放的,这对我来说仍然是一个困惑

假设我在一个方法中使用alloc创建一个视图控制器或任何其他控件

    -(void) displayView
    {
       RegViewController *sampleView = [[RegViewController alloc] init];
       [sampleView setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
       [sampleView setModalPresentationStyle:UIModalPresentationFormSheet];
       [self presentModalViewController:sampleView animated:YES];
    }

它是释放在方法块完成时创建的对象,还是应该通过为引用赋予nil来显式释放?

视图控制器在块的末尾自动释放。但是,这并不意味着它被解除分配-它仍然由
presentModalViewController:animated:
方法保留,并将在解除分配时被释放。

视图控制器在块结束时自动释放。但是,这并不意味着它被解除分配-它仍然由
presentModalViewController:animated:
方法保留,并将在它被解除时被释放(和解除分配)。

ARC代表自动引用计数。 它接管了用户维护对象引用计数的责任。 这就是为什么您不能再调用
[obj retain]
[obj release]
。 一旦参考计数器达到0,它就会为您释放它。
请记住,它不是垃圾收集器。如果不小心,这种机制可能会导致内存泄漏。但总的来说,它工作得很好。

ARC代表自动参考计数。 它接管了用户维护对象引用计数的责任。 这就是为什么您不能再调用
[obj retain]
[obj release]
。 一旦参考计数器达到0,它就会为您释放它。
请记住,它不是垃圾收集器。如果不小心,这种机制可能会导致内存泄漏。但一般来说,它工作得很好。

在这种情况下,当模式视图被取消时,sampleView将被释放。在这种情况下,不需要执行任何其他操作。

在这种情况下,当模式视图被取消时,sampleView将被释放。在这种情况下,不需要做任何其他事情

Does it release the object created when the method block completes or we should explicitly release by giving nil to reference?
答案是否定的

在上述情况下,
sampleView
retain count未达到0,因为您将其作为参数传递给了
self
class。一旦所有强引用被清除,其保留计数将下降到0,只有在这之后它才会被释放

您可以简单地将代码想象为
RegViewController*sampleView=[[[regviewcontrolleralloc]init]autorelease]

答案是否定的

在上述情况下,
sampleView
retain count未达到0,因为您将其作为参数传递给了
self
class。一旦所有强引用被清除,其保留计数将下降到0,只有在这之后它才会被释放


您可以简单地将代码想象为
RegViewController*sampleView=[[[regviewcontrolleralloc]init]autorelease]

使用ARC时,当对象超出范围(不再需要)时,编译器将包括对
release
方法的必要调用,在一开始,ARC的释放和not ARC应用程序之间没有区别。是范围是ARC唯一关心的问题。使用ARC时,编译器将在对象超出范围(不再需要)时包括对
release
方法的必要调用,在一开始,ARC的释放和非ARC应用程序之间没有区别。是的,范围是ARC唯一关心的问题。发现得很好,但在关闭时,它应该消失。如果我们关闭视图控制器,那么它会被释放吗?记住,ARC要释放它,对对象的所有强引用都必须为空。在这种情况下,Disclease方法应该为某个变量置零以释放它。这一点很好,但在Disclease时它应该消失。如果我们关闭视图控制器,那么它会被释放吗?记住,对对象的所有强引用都必须置零,ARC才能释放它。在这种情况下,dismise方法应该使某些变量为null,以便释放它。