2010-08-18 2 views
3

성능 도구에서 다음과 같은 문제가 발생합니다. 특히 STObject가 누출되었다고 말하고 있습니다. 왜 그런지 모르겠다.여기에 메모리 누수가있는 이유를 알 수 없습니다.

for (NSDictionary *message in messages) 
{ 
    STObject *mySTObject = [[STObject alloc] init]; 

    mySTObject.stID = [message valueForKey:@"id"]; 

    [items addObject:mySTObject]; 
    [mySTObject release]; mySTObject = nil; 

} 
[receivedData release]; receivedData=nil; 
[conn release]; conn=nil; 

UPDATE :

항목은 @property (비 원자, 유지)이 원인이됩니다 유지 수를 두를 수 있나요?

+2

'항목'으로 무엇을합니까? –

+3

아마도이 부분에 없을 것입니다. 정적 분석기를 확인 했습니까? – Eiko

+0

항목을 내 대리인에게 전달합니다. dealloc에서 릴리즈 됨 –

답변

-4

당신은 그것을 해제 후 무기 호에 mySTObject를 설정하는 ...

 [mySTObject release]; mySTObject = nil; 

그냥 그게해야한다고 생각 mySTObject = nil;을 제거 ..

+0

여기에는 문제가 없습니다. –

+0

누수 도구의 버그 일 수 있습니다. 그걸 고칠 수있을거야? – JeremyP

+0

나는 그가 GC objective-c에 익숙하다고 생각하지만,이 경우에는 충돌이 일어날 것이다. –

4

당신이 STObject에 저장된 일부 변수/속성을 가지고 있습니까? 그렇다면 STObject의 "- (void) dealloc"메서드에서 해제해야합니다. 그렇지 않으면 STObject가 해제 되더라도 STObject가 소유 한 변수는 해제되지 않습니다.

는 할당 해제 방법의 예는 다음과 같습니다

- (void)dealloc { 
    [stID release]; 
    [myVar2 release]; 
    [myVar3 release]; 
    [super dealloc]; 
} 

은 또한이 방법의 끝에 [슈퍼의 dealloc] 전화 있는지 확인하십시오.

+0

+1 누수가 대신 STObject 코드를 가리켜 야 할지라도 이것이 아마도 답이라고 생각합니다. 그러나 누출은 완벽하지 않습니다. – TechZen

+0

예, stID에 대한 속성 선언도 살펴볼 것입니다. stID는 어쩌면 유지할 수도 있습니다. – livingtech

6

NSArray 또는 NSDictionary에 항목을 추가하면 mySTObject가 그대로 유지됩니다. 즉, mySTObject를 해제 한 다음 nil로 설정하면 mySTObject가 유지됩니다. 보존되어 있고 "누출"이 사라진 저장소에서 개체를 제거하십시오.

+0

배열을 해제하면 배열이 할당을 해제 할 때 있던 모든 것을 해제하므로 동일한 효과가 나타납니다. –

+0

Ofcourse,하지만 코드 스 니펫이 너무 작아서 자신이하는 일을 볼 수 없으며 단지 도우 려합니다. –

+0

어디에서 배열을 출시합니까? 항목이 대리자에게 전달되는 도우미 클래스에 있습니다. 나는 그것을 dealloc()에서 풀어 놓았다.당신이 더 이상 필요하지 않습니다, 그리고 네의 경우 클래스 변수가 당신의 dealloc에서이 작업을 수행해야 –

0

10.6에있는 경우 Xcode는 "빌드 및 분석"기능을 통해 메모리 누수를 디버깅하는 데 매우 유용한 도구임을 알게되었습니다. 문서를 사용할 수 있습니다 here

관련 문제