【问题标题】:When will a autorelease get released什么时候会发布自动释放
【发布时间】:2011-08-29 16:13:13
【问题描述】:

我希望开发一个应用程序,其中将根据用户的交互创建“n”个视图。如果这些视图中的每一个都是使用 autorelease 动态创建的,那么视图何时真正被释放?

假设有 10 个视图,所有视图都是使用 autorelease 动态创建的:

  1. 视图 1 已创建并添加到导航堆栈,向用户显示视图 1
  2. 用户移动到另一个视图“视图 2”,视图 1 被推离堆栈并添加视图 2。 View 1 会在这里发布吗?我不希望它被发布,所以我应该保留它吗?
  3. 问题是,我可能不知道我正在创建多少视图,因此手动解除分配它们可能是个问题,或者有什么办法吗?

我在这里有点迷茫。

谢谢

【问题讨论】:

    标签: ios cocoa-touch uiview autorelease


    【解决方案1】:
    1. 您无需向导航堆栈添加视图,而是添加视图控制器。
    2. 当您推送视图控制器 2 时,第一个不会被释放,不会。导航控制器将始终保留它的所有视图控制器,直到它们从堆栈中弹出。它只会在未显示的视图控制器上调用 -unloadView 以释放一些内存,但如果您在视图控制器的 loadView 方法中创建视图,所有内容都会自动重新创建。
    3. 你不能手动释放任何东西,你只能释放它。由于导航控制器将保留您在其堆栈中添加的任何视图控制器,因此您可以自行释放它。

    从您提出问题的方式来看,我注意到您缺少一些关于 iOS SDK、MVC 和 OOP 的基本知识。老实说,我建议您先尝试创建一个比 that chat app of yours 简单得多的应用程序,以学习一些基础知识。

    【讨论】:

    • 嗨 fichek,对不起,我的意思是说视图控制器和释放(对不起,我使用了 dealloc 这个词)——仍然习惯于 IOS 术语。我当然是在做我的本分和学习,同时我也希望像你这样的专家能在学习的过程中帮助我。我找不到任何关于视图控制器如何在导航堆栈中释放的文档,因此我在这里问了它。你能指点我一些资源吗?
    • 这就是 StackOverflow 的用途 ;) 你在 iTunes U 上看过 CS193P 视频吗?它们是我能推荐给任何人的最好的 iOS 开发资源。
    • 谢谢,我正在看那些视频。我知道,当您将视图控制器从导航堆栈中弹出时,它会被释放,我怎样才能保留它而不被释放?
    • 一旦你分配/初始化一个视图控制器(或任何其他类的实例),它的retainCount为1。通常当你将该实例传递给某物时(比如将视图添加到另一个视图,或将视图控制器添加到导航堆栈,或将任何对象添加到数组),如果需要,它会自动由该对象保留,并在不再需要时释放(删除视图,弹出控制器,从数组中删除对象......)。因此,创建该对象的人可以在将其传递给其他对象后将其释放,除非它以后需要该对象。
    • 在这种情况下,您可以在不再需要它时释放它。您通常为此类对象创建实例变量或属性,并在 dealloc 方法中释放它们。
    【解决方案2】:

    如果您发布代码的关键部分会有所帮助,这样我们就可以看到您在做什么。简而言之,如果视图控制器在导航堆栈中,它将被导航控制器保留。如果它被弹出但你想保留它,你需要从另一个控制器中保留它,可能是呈现它的那个。

    【讨论】:

    • 嗨,彼得,我什至没有写一行代码,我只是想找到问题的答案,这样我就不会从一个奇怪的方向开始。我只是在寻找可以帮助我在进入应用程序之前学习一些东西的资源
    • 酷。我的建议:跳进去打破一切。这就是最好的程序员学习的方式,然后你就可以提出具体的问题,你会得到很好的答案。
    • 这就是我正在尝试做的事情 Peter,我还是 IOS 新手,已经习惯了 IOS 中的工作方式 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2011-07-09
    • 2012-09-11
    相关资源
    最近更新 更多