iphone - 多维数组 : NSMutableArray, NSArray、addObject 和 insertObjectAtIndex 发生内存泄漏

标签 iphone objective-c nsmutablearray nsarray

我已经使用这段代码几天了,试图确定一些内存泄漏的原因。 “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 方法时,我收到“错误访问”错误。

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

最佳答案

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

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

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

关于iphone - 多维数组 : NSMutableArray, NSArray、addObject 和 insertObjectAtIndex 发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200857/

相关文章:

iphone - IOS - 如何检查 SBJson 创建的 JSON NSData?

ios - 具有 "might"为 nil 的对象的 NSArray

iphone - 更改NSString的部分

javascript - Android 或 Iphone 中存储的 phonegap 数据库在哪里?

iphone - 如果我使用自定义 UITableViewCell,是否需要设置 heightForRowAtIndexPath?

iphone - 使用 Core Data 和 Magical Record 创建实例变量

objective-c - 在 Mac 应用程序中使用钥匙串(keychain)中的证书

ios - 在 CAMediaTimingFunction 的特定时间获取百分比?

objective-c - 如何在 Objective-C 中将值附加到数组

ios - 设置数组中所有对象的 boolean 属性