1

最近我遇到了一个问题,我从屏幕 A 导航到屏幕 B。当我从屏幕 B 回到屏幕 A 时,应用程序中的 Live Bytes 没有返回到初始值。经过进一步调查,我发现我在一些被多次调用的方法中保留了一些全局对象。所以我不得不修复方法的调用机制。

我解决了这个问题,但我正在考虑另一种解决方案。如果我只是在 dealloc 中使用了一个根据保留计数值运行的 for 循环会怎样。我认为不建议使用这种方法,但是如果我确定不能从文件外的任何地方访问对象,那么这种方法的确切问题是什么。

提前致谢。

4

2 回答 2

4

如果我只是在 dealloc 中使用了一个根据保留计数值运行的 for 循环会怎样。

如果 Xcode 检测到这样的代码并用几个安培为 MacBook Pro 的铝制外壳供电,我不会感到惊讶。

我认为不建议使用这种方法,但是如果我确定不能从文件外的任何地方访问对象,那么这种方法的确切问题是什么。

你是对的——不可取。至少有两个问题:

  1. 它完全打破了 Objective-C 的内存管理范式。您真的不能确定没有其他对象保留了您的对象之一。仅举一个例子:您在方法中不知道-dealloc您的 ivars 所引用的任何对象是否已被自动释放。

  2. 这是错误的修复。做你建议的事情并不能修复代码中的错误,它只会掩盖它们。您的对象应该正确管理它们使用的对象,而不用担心其他对象可能保留或未保留的内容。如果您遵循这个简单的公式,您就不必担心是否从“文件外部”访问对象——一切正常。

您不仅不应该使用-retainCount将保留次数降至 0,而且根本不应该查看-retainCount.

于 2013-03-04T08:15:25.997 回答
1

保留计数不是您可以指望的。有一些内部实现会在您不知道的情况下增加/减少保留计数,因此不建议使用它。

您应该使用 xcode 工具来查找内存泄漏,这将导致您在代码中保留对象而不释放对象的位置。

或者您可以启用 ARC 并让它为您管理内存。

于 2013-03-04T08:05:46.383 回答