0

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

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

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

4

1 回答 1

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. 或者,更好的是,使用您自己创建的类。

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

于 2013-06-06T11:54:25.797 回答