2011-03-05 2 views
2

나는이 코드를 사용하여 몇 일 동안 메모리 누수의 원인을 확인하기 위해 노력했습니다. 거의 모든 "for 루프"이후의 모든 라인은 누출 성능 도구에서 메모리 누출 백분율을 생성합니다.다차원 배열에서 메모리 누수 : NSMutableArray, NSArray, addObject 및 insertObjectAtIndex

나는 그것을 작동시키기 위해 다양한 순열을 시도 해왔다.

-(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 메소드를 호출하십시오.

어떤 통찰력은 크게 감사하고 내가 두 번째 코드 발췌에서 자세히에게

답변

2
당신은 arrContacts에 대한 메모리를 할당하는

, arrZzoneContactsarrNormalContacts을 제공 할 수 있는지 알려 주시기 바랍니다 될 것이다. 그런 다음 for 루프를 수행 한 후에 arrTempSorted을 복사하여 의 인스턴스에 대해 다른 인스턴스를 할당하려고합니다. arrContacts, arrZzoneContactsarrNormalContacts 변수에 새 인스턴스를 할당하면 원래 할당 한 메모리에 대한 참조가 손실되므로 더 이상 릴리스 할 기회가 없어 누출 될 수 있습니다.

무언가를 복사하면 새 인스턴스가 생성됩니다. 이러한 변수를 사용하여 수행하는 작업이 모두 사본을 저장하는 경우, 먼저 인스턴스를 할당 할 필요가 없으며 복사하여 수행합니다. 원래 인스턴스가 실제로 필요한 경우 해당 변수에 다시 할당하기 전에 먼저 인스턴스를 놓으십시오.

자세한 내용은 the Memory Management Programming Guide을 참조하십시오.

1

Jim이 언급했듯이 누출의 원인이되는 arrContacts 배열 (및 다른 배열)을 덮어 쓰고 있습니다.

하지만 arrContacts (및 다른 배열)가 이미 변경 가능하기 때문에이 문제를 완전히 피할 수 있습니다. -sortedArrayUsingFunction : context 메소드는 NSArray 클래스의 일부이며 결과와 함께 변경 불가능한 배열을 반환합니다. 그러나 NSMutableArray에는 똑같은 정렬을 수행하는 -sortUsingFunction : context라는 메서드가 있지만 arrContacts 배열 자체를 업데이트하기 만하면됩니다. 다른 배열로 복사하거나 다른 배열에서 복사 할 필요가 없습니다.

+0

안녕하세요. 신속하고 유익한 답변을 보내 주셔서 감사합니다. 현재 누출 도구가 응용 프로그램을 손상시키는 문제가 발생하여이 시점에서 성공 또는 실패를 확인할 수 없습니다. 내가 처음이 솔루션을 구현하려 할 때 잘못된 액세스 오류가 발생했습니다. 나는이 문제들을 해결하고 내 결과가 무엇인지 알려 줄 때 다시 회신 할 것입니다. – Mark

+0

후속 조치 : NSMutableArray의 sortUsingFunction : context 메소드를 사용하여 누출 문제를 성공적으로 해결했습니다. 도와 주셔서 다시 한번 감사드립니다 !! 악의적 인 접근은 누출을 고쳐야 만 불필요했던 누적 된 전화가 릴리스로 인해 발생했습니다. – Mark