【问题标题】:Instruments not detecting obvious memory leak仪器未检测到明显的内存泄漏
【发布时间】:2013-06-06 11:26:54
【问题描述】:

我在应用程序 didFinishLaunchingWithOptions 中创建了一个非常明显的内存泄漏。

NSArray *temp = [[NSArray alloc] initWithArray:[[NSArray alloc] initWithArray:@[]]];
temp = [[NSArray alloc] initWithArray:@[]];
temp = nil;

但是,这些工具在任何时候都没有显示内存泄漏,这让我相信那里无法正常工作。其他人经历过这种情况吗?

【问题讨论】:

  • 你是ARC吗?如果是这样,泄漏在哪里?但即使没有 - 你实际上并没有在堆上分配任何内存。堆栈中唯一的内存消耗是局部变量 temp。

标签: objective-c memory-leaks instruments


【解决方案1】:

根据我的观察:空的 NSArray 基本上是一个单例实例。您不能以这种方式创建内存泄漏,因为您的应用程序将始终引用空数组“singleton”。

这会告诉你所有的空数组都指向同一个内存地址:

NSArray *array1 = [NSArray array];
NSArray *array2 = [NSArray arrayWithArray:array1];
NSArray *array3 = [NSArray arrayWithArray:@[]];
NSArray *array4 = @[];
NSArray *array5 = [@[] copy];
NSArray *array6 = [[NSArray alloc] initWithArray:[[NSArray alloc] initWithArray:@[]]];

NSLog(@"%p", array1);
NSLog(@"%p", array2);
NSLog(@"%p", array3);
NSLog(@"%p", array4);
NSLog(@"%p", array5);
NSLog(@"%p", array6);

无论您在应用程序生命周期的哪个位置记录空数组的地址,它始终是相同的。

您应该使用NSMutableArray 进行测试。或者,更好的是,使用您自己创建的类。

如果您使用内置类,有时会在后台进行大量优化。例如类集群,您无法确定初始化程序返回的确切类,或者在这种情况下的单例实例。

【讨论】:

    猜你喜欢
    • 2011-08-30
    • 2012-07-16
    • 2011-10-14
    • 1970-01-01
    • 2011-10-27
    • 2023-03-11
    • 1970-01-01
    • 2022-06-11
    • 2012-07-06
    相关资源
    最近更新 更多