1

C 배열을 사용할 때 코드가 누출되는 것으로 보이고 이유가 확실하지 않습니다.ARC를 사용하여 누설이 활성화되었습니다.

/* LeakyClass.m */ 

@property (nonatomic, assign) char **array1; 
@property (nonatomic, assign) id __strong *array2; 
@property (nonatomic, assign) unsigned short currentDictCount; 

//... 

- (id)initWithCapacity:(unsigned short)capacity 
{ 
    if ((self = [super init])) { 
     _array1 = (char **)calloc(sizeof(char*), capacity); //Leak 
     _array2 = (id __strong *)calloc(sizeof(id), capacity); //Leak 
    } 
    return self; 
} 

- (void)dealloc { 
    free(_array1); 
    free(_array2); 
    _array1 = NULL; 
    _array2 = NULL; 
} 

- (void)addObjectToArray2:(id)object andCharToArray1:(char *)str 
{ 
    [self array2][[self currentDictCount]] = object; 
    [self array1][[self currentDictCount]] = str; 

    [self setCurrentDictCount:[self currentDictCount] + 1]; 
} 

@end 

는 I이 함께 LeakyClass 전화 :기구는, 본 실시 예에서는 어레이 1. object, @"example"[NSURL URLWithString:exampleString]을 추가 LeakyClass에 전달 된 값을 각각 가리키는

/* OtherClass.m */ 

LeakyClass *leaky = [[LeakyClass alloc] initWithCapacity:20]; 
[leaky addObjectToArray2:object andCharToArray1:"1"]; // Leak 
[leaky addObjectToArray2:@"example" andCharToArray1:"2"]; /Leak 
[leaky addObjectToArray2:[NSURL URLWithString:exampleString] andCharToArray1:"3"]; /Leak 

. 인스트루먼트는 _array1_array2에 대해서도 calloc을 가리키고 있지만 둘 다 dealloc에 둘 다 무료로 지정합니다.

내가 누락 된 항목이 있습니까? id 포인터로 __strong를 사용하여 모든의

+0

왜 'NSMutableArrays'를 사용하지 않습니까? – Ismael

+0

뿐만 아니라 이것은 NSMutableDictionary의 기본 구현처럼 보입니다. 너 왜 이러는거야? – WDUK

+1

사실 그는 객관적인 수업을 사용할 수는 있지만 초심자가 이러한 것들을 시도해 보는 것이 좋습니다. –

답변

0

첫째, ARC하지 당신이 각 객체에 포인터로 release, retain 등 메시지를 보내는 의미 노력할 것입니다 (얼마나 많은조차 모르는 현재의 구현을 제공 당신이 동적으로 할당 한 객체), 그래서, 짧은 기간에, 당신은 그것의 유무와 동일합니다. 누수에 관해서는 할당하기 전에 포인터를 비우십시오.

어쨌든, 언급 된 다른 사람과 마찬가지로 NSArray 또는/및 NSDictionary을 사용하지 않으시겠습니까? 아래의 코멘트 다음

편집 :

나는 그것이 당신의 메모리 관리와 어떤 식 으로든 도움이되지 않습니다, 의미, 그것은 의미의 "당신과 함께 또는없이 똑같아"라고합니다. 그러나 소유권 한정자가 있어야하므로 제거하는 것만으로도 오류가 발생합니다 (보고 한대로). 당신은 당신이 alloc 전에 free에 시도했다, 메모리 문제에 관해서는

@property (nonatomic, assign) id __unsafe_unretained *array2; 

를 사용해야합니까? initWithCapacity:이 두 번 호출되면 어떻게됩니까? 두 번 호출하지 않을 것이지만 계측기가 알 수있는 것은 아닙니다.

또한 here은 더 나은 ARC 및 모든 한정자를 이해하는 데 필요한 사양입니다.

free(_array1); 
free(_array2); 

이 같다 :

+0

이것은 사실이 아닙니다. 이 경우'__strong'을 제거하면 컴파일 오류가 발생합니다. –

+0

제거하면 어떤 오류가 발생합니까? –

+0

''const가 아닌 타입 'id'에 대한 포인터. 명시 적 소유권이 없음. –

1

의 malloc /은 calloc 메모리 계산 REF가 아닌, 당신은 강력하게 할당하고 해제하지 않습니다 it.Setting에게 NULL에 그 포인터를 할당 해제 할 경우, 무료로 사용할시기를 결정 dealloc 메시지를 처리하지만 객관적인 클래스가 아닌 원시 메모리를 처리합니다.
당신이있는 NSData, 또한 가비지 컬렉터의 원시 메모리를 포함 사용하여 포장 할 경우 데이터

@property (nonatomic,strong) NSData* wrapper1; 
@property (nonatomic,strong) NSData* wrapper2; 

랩 :

wrapper1= [NSData dataWithBytesNoCopy: _array1 length: capacity*sizeof(char*) freeWhenDone: YES]; 
wrapper2= [NSData dataWithBytesNoCopy: _array2 length: capacity*sizeof(id) freeWhenDone: YES]; 

을 그리고 그것을 해제하지 않지만, 대신에 전무로 설정 wrapper1과 wrapper2. 그러나 dealloc 메소드를 오버라이드하지 않아도, 객체가 죽은 후에 모든 메모리를 해제 할 수 있습니다.

+0

나는 이것을 지금 시도 할 것이다. 나는 이미 dealloc에서 배열을 해제하고 있지만 NSData로 시도하고 누출을 중지하는지 확인합니다. –

+0

이 코드는 완벽하게 작동하며 배열 누수 문제를 해결합니다. 감사! array2에 삽입하기 위해 전달되는 객체 (질문 맨 아래 참조)가 누출되는 이유를 알고 있습니까? –

+0

이므로 _array2에는 강력한 참조가 있으며 모든 개체가 암시 적으로 유지됩니다. –

관련 문제