XCode/Instruments没有显示内存泄漏

Jon*_*Jon 9 xcode objective-c instruments ios

我正在关注斯坦福iOS开发讲座,我有一个计算器大脑课程,它已经alloc init在控制器中,但我没有release在它dealloc.

- (CalculatorBrain *)brain
{
    if (!brain) 
        brain = [[CalculatorBrain alloc] init];

    return brain;

}
Run Code Online (Sandbox Code Playgroud)

我从XCode运行 - >运行与性能工具,应用程序启动,没有出现泄漏,然后我点击了iOS模拟器中的主页按钮,没有,我然后双击主页按钮并关闭应用程序,仍然没有.

我也做了Build&Analyze,它没有发现任何东西

你能不能让我知道为什么它不接受它?

Die*_*Epp 6

看起来好像没有可检测到的泄漏.看看这一行:

brain = [[CalculatorBrain alloc] init];
Run Code Online (Sandbox Code Playgroud)

只要brain指向一个对象,该对象就不会被视为"内存泄漏".如果在某些时候你这样做,

brain = nil;
Run Code Online (Sandbox Code Playgroud)

然后泄漏将登记.取消分配容器对象也可以实现这一点,但是你确定它已被解除分配吗?(例如,当程序退出时,它不会被释放.)

问题:泄漏探测器无法检测到所有内存泄漏 - 这是一个经过数学证明的事实.大多数探测器只检测无法到达的物体,而且许多泄漏探测器特别容易受到漏报的影响 - 在C中,很难在运行时判断指针和整数之间的区别.

编辑:听起来你的应用程序只创建一个控制器实例,它只创建一个实例CalculatorBrain.如果你想想内存泄漏真的就是,你可以将其定义为你的程序不释放回操作系统未使用的内存.

  • 程序运行时,CalculatorBrain总是在使用,因此它不是泄漏.
  • 程序退出时,操作系统会自动回收进程使用的所有内存,因此程序退出后不会出现任何内存泄漏.

如果你想创建一个泄漏来查看它的外观,你可以CalculatorBrain在程序运行时多次创建一个新的,但忘记发布未使用的版本.在这种情况下,随着程序的运行,CalculatorBrain会积累越来越多的实例.在iOS和其他嵌入式系统上,这通常会导致程序崩溃.在现代64位计算机上,它将逐渐填满可用的交换空间,直到您用完交换,地址空间或其他资源 - 导致程序崩溃或使系统无响应.

标准做法是不关心释放整个程序运行时应该存在的对象.