我已经使用这段代码几天了,试图确定一些内存泄漏的原因。 “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 方法时,我收到“错误访问”错误。
如有任何见解,我们将不胜感激,如果我可以提供更详细的信息,请告诉我
最佳答案
您正在为第二个代码摘录中的 arrContacts
、arrZzoneContacts
和 arrNormalContacts
分配内存。然后,在 for 循环之后,您通过复制 arrTempSorted 为 NSMutableArray
的不同实例分配更多内存。当您将这些新实例分配给 arrContacts
、arrZzoneContacts
和 arrNormalContacts
变量时,您将丢失对最初为其分配的内存的引用,因此您不再有机会释放它,从而导致泄漏。
当您复制某些内容时,您正在创建一个新实例。如果您对这些变量所做的只是存储副本,那么您不需要首先分配实例,副本会为您完成。如果您确实需要该原始实例,请在重新分配给这些变量之前释放它。
有关详细信息,请参阅 the Memory Management Programming Guide .
关于iphone - 多维数组 : NSMutableArray, NSArray、addObject 和 insertObjectAtIndex 发生内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200857/