【问题标题】:iPhone dev - objects stay until user quits, don't release?iPhone dev - 对象会一直保留到用户退出,不释放?
【发布时间】:2009-08-21 04:00:46
【问题描述】:

在我的应用程序中,说它倒计时,最后只会发出哔哔声,直到用户退出应用程序,说有一个 NSTimer 并且永远不会释放(或者在 NSTimer 的情况下,invalidate it) 它,因为它需要一直保留到用户退出应用程序?

【问题讨论】:

    标签: iphone memory-management memory-leaks


    【解决方案1】:

    从技术上讲,是的,但我发现有两件事是正确的:

    • 这是一个容易养成的习惯,让自己相信 X 不需要被释放,因为你已经说服自己它需要永远存在,而它不需要并且泄漏,或
    • 在未来的某个时候,您会意识到您确实希望能够控制该计时器,现在设置 ivar 将为您省去很多麻烦(不是双关语)

    【讨论】:

    • 有人建议使用 applicationWillTerminate。使用这种方法有什么意义?为什么我不释放需要留在那里的所有东西(窗口、视图控制器)?你认为我应该在它自己的 dealloc 中释放它吗?
    • 不太清楚你在自己的 dealloc 中释放一个项目是什么意思;仅在释放项目时才调用 dealloc,因此,如果仅在释放它(为什么调用 dealloc)后才释放它(在 dealloc 中),您将永远不会释放它:) 我将支持使用 applicationWillTerminate -操作系统将在应用程序终止之前为您的应用程序委托调用此例程,让您有机会在应用程序最终退出之前进行任何内存清理等工作。
    • 我的意思是我必须从计时器中制作 ivars(它们在根视图控制器类中),然后我不应该在根视图控制器的 dealloc 中释放这些 ivars ?..我的意思是很多事情需要保留,直到用户退出应用程序。为什么不释放视图控制器和 applicationWillTerminate 中的其他所有内容?
    • 我的意思是在它使用的类中使用它自己的 dealloc,因为它需要是一个 ivar 才能在它声明的方法之外的任何其他方法中释放。
    【解决方案2】:

    是的,你可以!如果我是你,我会在应用程序委托中初始化它,在 applicationDidFinishLoading 中并在 applicationWillTerminate 中使其无效。

    【讨论】:

    • 问题是我必须为 3 个对象创建 ivars,这些对象将一直保留到应用程序退出。因为这 3 个对象是在视图控制器中创建的。
    • 在viewController的applicationWillTerminate和dealloc中释放/失效有什么区别?
    • 不多,如果 viewController 是根视图控制器。在任何情况下,您都应该始终在它被初始化的地方释放一个对象。虽然现在没关系,但当您更改视图控制器顺序时,它可能会为您节省一些调试时间。
    • 按照习惯,最好在 -dealloc 中无效、释放并设置为 nil。在大多数情况下,应用程序控制器的 -dealloc 永远不会真正运行(ObjC 不保证在程序终止时运行 -dealloc),但正如 msaeed 指出的那样,它仍然是一个非常好的习惯。以这种方式“泄漏”内存没有危险,因为 Unix 会在应用程序终止时恢复所有内存(不像某些移动操作系统,这是一个严重的问题)。
    • 你不应该释放使用 NSTimer 的 scheduleTimerWithTimeInterval:target:selector:userInfo:repeats: 创建的计时器,就像我正在使用的那样,只会失效。但是如果它是一个ivar,那是否意味着你还需要释放?为什么设置为零?
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2012-01-17
    • 2011-07-25
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多