【问题标题】:Memory leaks from Multidimensional array: NSMutableArray, NSArray, addObject and insertObjectAtIndex来自多维数组的内存泄漏:NSMutableArray、NSArray、addObject 和 insertObjectAtIndex
【发布时间】:2011-03-05 00:52:50
【问题描述】:

我已经使用这段代码几天了,试图确定一些内存泄漏的原因。 “for 循环”之后的几乎每一行都会在泄漏性能工具中生成内存泄漏百分比。

我一直在尝试各种排列以使其发挥作用。

这是我现在正在运行的代码,试图深入了解它:

-(void)populateArrays
{
    NSArray *arrTempSorted;
    [arrContacts removeAllObjects];
    [arrZzoneContacts removeAllObjects];
    [arrNormalContacts removeAllObjects];

    for( int i = 0 ; i < 200 ; i++ )
    {
        [arrZzoneContacts addObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease]];
        [arrNormalContacts insertObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease] atIndex:[arrNormalContacts count]];
        [arrContacts addObject:[[[NSArray alloc] initWithObjects: [NSNumber numberWithInt:1], @"Composite Name", @"YES", @"first name", @"last name", @"first", nil] autorelease]];
    }

    arrTempSorted = [arrContacts sortedArrayUsingFunction:order context:NULL];
    arrContacts = [arrTempSorted mutableCopy];

    arrTempSorted = [arrZzoneContacts sortedArrayUsingFunction:order context:NULL];
    arrZzoneContacts = [arrTempSorted mutableCopy];

    arrTempSorted = [arrNormalContacts sortedArrayUsingFunction:order context:NULL];
    arrNormalContacts = [arrTempSorted mutableCopy];

    //[arrTempSorted release];

}

数组和函数在 appDelegate.h 文件中。数组的初始化如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    //Global variables
    arrContacts = [[NSMutableArray alloc] init];
    arrZzoneContacts = [[NSMutableArray alloc] init];
    arrNormalContacts = [[NSMutableArray alloc] init];

    // Override point for customization after application launch.
    [window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

我尝试过在 didFinishLaunchingWithOptions 中声明一个数组然后将其分配给 arrContacts(例如)然后释放它的方法,但是当我们使用 populateArrays 方法时出现“错误访问”错误。

任何见解将不胜感激,如果我可以提供更多详细信息,请告诉我

【问题讨论】:

    标签: iphone objective-c nsmutablearray nsarray


    【解决方案1】:

    您在第二个代码摘录中为arrContactsarrZzoneContactsarrNormalContacts 分配内存。然后,在您的 for 循环之后,您通过复制arrTempSortedNSMutableArray不同 实例分配更多内存。当您将这些新实例分配给您的 arrContactsarrZzoneContactsarrNormalContacts 变量时,您将失去对最初为它们分配的内存的引用,因此您不再有机会释放它,因此泄漏.

    当您复制某些内容时,您正在创建一个新实例。如果您对这些变量所做的只是存储一个副本,那么您不需要首先分配实例,副本会为您完成。如果您确实需要该原始实例,请在重新分配给这些变量之前释放它。

    有关详细信息,请参阅the Memory Management Programming Guide

    【讨论】:

      【解决方案2】:

      正如 Jim 所说,您正在覆盖导致泄漏的 arrContacts 数组(和其他数组)。

      不过,附带说明一下,您可以完全避免这个问题,因为您的 arrContacts(和其他数组)已经是可变的。 -sortedArrayUsingFunction:context 方法是 NSArray 类的一部分,它返回一个带有结果的非可变数组。但是,NSMutableArray 有一个名为 -sortUsingFunction:context 的方法,该方法将执行完全相同的排序,但它会在原地执行此操作并仅更新 arrContacts 数组本身。无需复制到其他数组或从其他数组复制。

      【讨论】:

      • 嗨- 非常感谢您的及时和信息丰富的回复!我目前遇到泄漏仪器使我的应用程序崩溃的问题,因此我目前无法确认成功或失败。当我第一次尝试实施这些解决方案时,我遇到了一些 Bad Access 错误。当我解决了这些问题后,我会回信告诉你我的结果。
      • 跟进:我使用 NSMutableArray 的 sortUsingFunction:context 方法成功解决了泄漏。再次感谢您的帮助!!错误的访问是由于在我修复泄漏后不必要的发布被调用造成的。
      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 2017-05-26
      • 2011-05-27
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2011-01-21
      相关资源
      最近更新 更多