【问题标题】:When and why do i have to use release?我何时以及为什么必须使用发布?
【发布时间】:2011-10-19 17:18:55
【问题描述】:

我通过观看教程和尝试学习了objective-c 和xcode,所以我自己一个人。我从来没有真正和老师或类似的东西上过真正的课。而且我从不知道release 的用途。当然,我经常看到它,但我想知道一些关于它的事情。我是否必须为我在- (void)dealloc 的头文件中声明的每个对象使用发布?如果我在 IBAction 中创建一个临时 NSString,我必须在操作结束时释放它吗?如果我不使用释放会发生什么?发布在编程语言中的真正含义是什么?

【问题讨论】:

    标签: objective-c ios xcode release


    【解决方案1】:

    规则很简单:只要通过newallocretaincopy(简称NARC)获得对象,就需要释放它。而已。一旦你完成了一个 NARC 对象并且你不再需要它,你必须release它。如果你是通过其他方式获得的对象,那么你一定不能release它。

    如果你在类初始化的某个地方通过 NARC 获得了一个对象,并且你需要在类实例的生命周期内保留这个对象,那么在 dealloc 方法中 release 它。这将确保对象尽可能多地存活,并在类的实例死亡后死亡。

    在 Objective-C 中,每个实例都包含一个引用计数属性。使用 NARC 创建对象时,此引用计数为 1。每个连续的 retain 将引用计数增加 1。每个连续的 release 将引用计数减少 1。当引用计数达到 0 时,对象为已解除分配。

    因此,如果您不释放 NARC 对象,那么您将发生内存泄漏(因为引用计数将保持在 0 以上,并且该对象将永远不会被释放,即使您已经完成了它)。这意味着您的应用程序将拥有一个永远不会使用的内存空间。如果这些加起来,那么您将浪费大量宝贵的系统资源。在 iOS 上,这可能会导致您的应用被终止。

    如果您需要返回使用 NARC 创建的对象,那么您应该autorelease 它。这基本上意味着“该对象稍后将调用release”。所以如果调用你的方法的方法需要持有你返回的这个对象,它可以retain它,现在对象的引用计数设置为2。release将按计划稍后调用,但是该对象是retained,它的引用计数将变为1,并且它不会死。现在调用者有责任在它完成后调用release

    【讨论】:

    • 好的,所以如果我创建一个插座并且不为其添加属性,那么我不需要释放它,因为只有属性调用retain
    • @Maxner,如果你创建了一个 outlet 并且想要使用它,那么你需要创建一个属性。如果你不使用它,那么首先不要将它添加为插座。
    • 编译器什么时候释放对象?任何想法。
    【解决方案2】:

    阅读 Objective-C 中内存管理的基本概念(分配、引用计数、保留/释放/自动释放...)可能会让您受益。

    Apple provides a nice introduction here.

    这是一个很容易让新手和有经验的程序员感到困惑的话题,如果你对它有深入的了解,你会对自己大有裨益。

    这真的不是10行就能解释的。但是开始阅读上面的文档,你将会更好地理解 Cocoa 中的内存管理。

    【讨论】:

      猜你喜欢
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多