内存泄漏:在iPhone应用程序中释放NSArray的问题

| 我有一个代码,显示了Instruments中的泄漏。它显示了我用I1ѭ的内容初始化
arrayDetPerformance
的地方的泄漏 如果我释放
arrayDetail
,则我的应用会崩溃。 有什么事吗 这是代码:
    NSDictionary *finalResult = [extractUsers JSONValue];
    //      NSLog(@\" Stamp-16 : %@\",[NSDate date]);
    NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
    arrayDetail = [[finalResult objectForKey:@\"Detail\"]
    NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);       //RETAIN COUNT IS 2

    //  NSLog(@\"Data is : %@\",array1);
    //      NSLog(@\" Stamp-17 : %@\",[NSDate date]);

    //NSLog(@\"Final Value is : %@\",[[allUsers objectAtIndex:0] valueForKey:@\"password\"]);

    //[self setUserData:allUsers];
    //[tblView reloadData];

    [responseString release];
    [request release];

}



//sleep(0.3);
//[inProgressIndicator stopAnimating];
[fileContents release];

//Release all the allocated data
[json release];
//label.text = @\"Finish\";
//  NSLog(@\" Stamp-19 : %@\",[NSDate date]);
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
//NSLog(@\"Array2  : %d\",[array2 retainCount]);

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];
chartPoints= [arrayDetPerformance valueForKey:@\"Points\"];
NSLog(@\"Chart Points: %@\",chartPoints);
[def setObject:chartPoints forKey:@\"yarray\"];
[def setObject:@\"YES\" forKey:@\"flagThumb\"];

//array1 = [[NSMutableArray  alloc] initWithObjects:@\"New\",@\"Table\",@\"View\",nil];
//[self.Dettable reloadData];
//sNSFileManager *fileManager = [NSFileManager defaultManager];
//[array2 release];
NSLog(@\"ArrayDEtPerfomance : %d\",[arrayDetPerformance retainCount]);
NSLog(@\"array2 : %d\",[arrayDetail retainCount]);
if([chartPoints count]>0)
{
    PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectAtIndex:0];
    [plotItem imageHive:Fund];
}

//[arrayDetail release];

}
该行显示内存泄漏
arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];
我也对为什么下面的代码中保留计数直接从0变为2感到困惑:
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
    arrayDetail = [[finalResult objectForKey:@\"Detail\"]
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);       //RETAIN COUNT IS 2
有什么事吗     
已邀请:
它显示泄漏是因为您分配了“ 0”,然后没有释放它。就那么简单。至少从显示代码中我们可以看出。 至于其余的,永远不要使用ѭ7来调试内存问题!您必须了解简单的内存管理规则并遵循它们,仅此而已。由于您不知道Apple的基础代码做什么,因此您不能依赖对象的保留计数。 关于您与此代码有关的问题:
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
arrayDetail = [[finalResult objectForKey:@\"Detail\"]
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);       //RETAIN COUNT IS 2
您将整个对象分配给
arrayDetail
,因此在分配之前和之后比较
arrayDetail
的任何属性完全没有意义。保留计数可能遍布整个地方,并且不会告诉您任何信息。 我的印象是,您真的不知道自己在这里做什么。您应该一次又一次地阅读内存管理规则,直到您完全理解它们为止。     
retainCount
不会帮助您调试问题(实际上,它几乎永远与调试无关,因此最好还是把它忘在这里)。 不要释放
arrayDetail
,因为您不拥有它。问题出在
arrayDetPerformance
。您正在该行上分配一个对象,并且该对象不会在任何地方被释放。现在,您可能正在代码的其他地方执行此操作,但是如果您没有这样做,请在使用完毕后将其发送给
release
。 编辑 如果您要在
dealloc
方法中取消分配
arrayDetPerformance
,我假设它是一个实例变量?在这种情况下,您不能假定它尚未指向某个对象,因此在将其分配给新对象之前,应先向其发送“ 14”字样。 或者,如果将其配置为属性,只需使用
self.arrayDetPerformance = ...
,它将为您进行内存管理。     
不要调用keepCount
retainCount
没用。对象的绝对保留数是实现细节。规则很简单;如果导致保留某些内容,则必须在完成处理后将其释放。故事结局。 内存管理文档对此进行了全面讨论。 首先,
retainCount
永远不会返回零。唯一的零值是发生在消息
nil
上。这个:
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);        //RETAIN COUNT IS 0
arrayDetail = [[finalResult objectForKey:@\"Detail\"]
NSLog(@\"Array2  : %d\",[arrayDetail retainCount]);       //RETAIN COUNT IS 2
您使ѭ1指向第二行的另一个对象。因此,该行之前/之后的保留计数之间没有关系。 当泄漏告诉您泄漏在这样的特定线路上时...
arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail];
...告诉您该行上分配的对象已泄漏。这并不是在告诉您特定的线路是造成泄漏的原因。泄漏的原因可能是您要么保留过多它,要么忘记泄漏它。 您已经在几条评论中说过您正在“在dealloc中分配[某物]”。显示您的dealloc方法的实现。     
[arrayDetPerformance版本];不是用您的代码编写的; 因此,它显示内存泄漏。     

要回复问题请先登录注册