我一直在使用这段代码几天试图确定一些内存泄漏的原因。 “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方法时,我得到“错误访问”错误。
非常感谢任何见解,如果我能提供更多详细信息,请告诉我
答案 0 :(得分:3)
您正在为第二个代码摘录中的arrContacts
,arrZzoneContacts
和arrNormalContacts
分配内存。然后,在for循环之后,通过复制NSMutableArray
为不同 arrTempSorted
实例分配更多内存。当您将这些新实例分配给arrContacts
,arrZzoneContacts
和arrNormalContacts
变量时,您将丢失对最初为其分配的内存的引用,因此您不再有机会释放它,因此泄漏。
复制内容时,您正在创建新实例。如果您正在使用这些变量进行存储副本,那么您不需要首先分配实例,而是为您复制。如果确实需要原始实例,则在重新分配这些变量之前将其释放。
有关详细信息,请参阅the Memory Management Programming Guide。
答案 1 :(得分:2)
正如Jim所说,你正在覆盖导致泄漏的arrContacts数组(以及其他数组)。
作为旁注,您可以完全避免此问题,因为您的arrContacts(和其他数组)已经是可变的。 -sortedArrayUsingFunction:context方法是NSArray类的一部分,它返回一个带有结果的非可变数组。但是,NSMutableArray有一个名为-sortUsingFunction:context的方法,它将执行完全相同的排序,但它会在适当的位置执行它,只需更新arrContacts数组本身。无需复制到其他阵列和从其他阵列复制。