【问题标题】:How to check heap memory using instruments in Xcode?如何在 Xcode 中使用仪器检查堆内存?
【发布时间】:2013-08-20 12:27:58
【问题描述】:

我正在尝试使用 Xcode 中的工具分析泄漏。这是我正在尝试的示例代码。

+(NSString *) getUniqueFileName
{
NSDate *time = [NSDate date];
NSDateFormatter* df = [NSDateFormatter new];
[df setDateFormat:@"MMddyyyyhhmmssSSS"];
NSString *timeString = [df stringFromDate:time];
NSString *fileName = [NSString stringWithFormat:@"%@", timeString ];
//[time release];
// [df release];
// [timeString release];
return  fileName ;
}

每次拍摄照片时,我都会使用此方法生成文件名。所有变量都是他的方法的局部变量。如果我在获取文件名后尝试释放时间、df、时间字符串,则会收到发送到已释放实例的消息。我确信如果我不释放这些变量,内存就会泄漏。我尝试了仪器,得到了以下结果,就是这样。

现在我的问题是 79.6% 的红色突出显示行是什么意思? 20.4% 的黄色行突出显示?一般来说,红色是危险的。但是 % 显示了什么?它是如何计算的?当我检查调用树时,我会得到一个名为“泄漏”的列,用于特定方法,并且将包含 100、234、560、2345 等一些数字。这个数字说明了什么。帮帮我。如果有人可以为我提供了解仪器的良好链接,将不胜感激。

【问题讨论】:

    标签: ios memory-leaks instruments


    【解决方案1】:

    为了解释屏幕截图中的百分比,在 getUniqueFileName: 中分配的泄漏内存中有 79.6% 分配在红色代码行中。在 getUniqueFileName: 中分配的泄漏内存中有 20.4% 是在黄色代码行中分配的。红色表示高百分比。它可能有危险,也可能没有危险。

    为了解释泄漏列,它告诉您方法中的泄漏次数以及该方法调用的任何函数。这并不一定意味着方法本身存在很多泄漏。例如,Cocoa 和 Cocoa Touch 应用程序以 main() 函数开始。如果 main() 函数在 Leaks 列中的值为 100,则意味着应用程序有 100 次内存泄漏,而不是 main() 有 100 次泄漏。

    【讨论】:

      【解决方案2】:

      如果您使用 ARC,请在创建泄漏时将其禁用到您的班级 - 现在您可以释放您的变量: 或者您可以尝试像这样创建日期格式化程序:

      NSDateFormatter *df = [[NSDateFormatter alloc] init];
      

      【讨论】:

      • 感谢磷虾的回复,但我没有使用 ARC。即使是 new 运算符也会给我一个引用计数为 1 的对象,对吗?
      • 所以尝试像这样初始化您的日期格式化程序变量: NSDateFormatter *df = [[NSDateFormatter alloc] init];
      • 看:new 不支持自定义初始化器(如 initWithString),alloc-init 比 new 更明确。这取决于您调用它的类。很可能它是您所说的便利分配器,它在内部调用 [[AnyClass alloc] init]。你是对的,如果有可用的便利分配器,你应该使用它们。但有时没有,有时您不想要自动释放的对象(方便分配器返回)。
      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 2011-08-30
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2014-11-16
      相关资源
      最近更新 更多