仪器没有检测到明显的内存泄漏

时间:2013-06-06 11:26:55

标签: objective-c memory-leaks instruments

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

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

然而,这些工具在任何时候都没有显示内存泄漏,这让我相信它无法正常工作。还有其他人经历过这个吗?

1 个答案:

答案 0 :(得分:3)

根据我的观察:空的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进行测试。或者,更好的是,使用您自己创建的课程。

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