0

NSArray 및 NSMutableArray를 릴리스하지만 표시 메모리 누수가 있습니다. ZoneData 코드이아이폰 : 어떻게 NSArray 메모리 누출을 해결하기 위해?

-(ZoneData*) initWithZoneName:(NSString *)zoneNameIn SdName:(NSString *)sdNameIn eCount:(NSString *)eCountIn iCount:(NSString *)iCountIn StandLat:(NSString *)standLatIn StandLong:(NSString *)standLongIn 
{ 
    self = [super init]; 
    if (self) 
    { 
     zoneName = [zoneNameIn copy]; 
     lsdName = [sdNameIn copy]; 

     leCount = [eCountIn intValue]; 
     liCount = [iCountIn intValue]; 
     standLat = [standLatIn copy]; 
     standLong = [standLongIn copy];  
    } 

    return self;  
} 

enter image description here

같이있는 동안 어떻게이 문제를 해결하려면?

+0

그리고 당신은 해제해야합니다 * 영역 이름 *, * lsdName *, * standLat * * standData * ZoneData *의 dealloc * 메소드에서 * long *. – EmptyStack

+0

forloop의 모든 반복에서 ZoneData * 데이터를 할당하는 이유는 무엇입니까? 동시에 전에도 할 수 있습니다. –

답변

2

문제는 인스턴스 변수입니다. -init에서 배열의 문자열 복사본에 올바르게 할당하고 있습니다. 그러나 -dealloc에 릴리스해야합니다. 누수 도구는 당신에게 누출을 말하고 왜 거기에 문자열 대신 init 메소드와 NSArray을 만들 경우

-(void) dealloc 
{ 
    [zoneName release]; 
    [lsdName release]; 
    [standLat release]; 
    [standLong release]; 
    [super dealloc]; 
} 

지금, 당신은있다 질문 할 수있다. 그 이유는 불변 객체의 경우 -copyself에 대한 전송 유지 이외의 작업을 수행하도록 최적화 되었기 때문입니다. 따라서 인스턴스 변수로 복사 한 사본은 실제로 생성 된 것과 동일한 객체입니다. -componentsSeparatedByString:

2

componentsSeparatedByString:은 자동 반복 처리 된 NSArray을 반환합니다. 당신은 그걸 공개하지 않아도되지만 가장 가까운 NSAutoreleasePool이 그 일을합니다. 61 행에서 배열을 과량 반복합니다.

루프는 루프의 각 반복에서 오토 릴리즈 객체를 지울 수 있습니다 수행하는 동안 당신은 메모리 사용량이 염려되는 경우 :

for (...) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    // your loop contents. 

    [pool drain]; 
} 
관련 문제