2

누출 :오토 릴리즈와 객체를 반환하지만, 난 여전히 기억 나는이 메모리를 유출하고

내 사용자 정의 클래스 :

애플 대리자에서
+ (id)vectorWithX:(float)dimx Y:(float)dimy{ 
return [[[Vector alloc] initVectorWithX:dimx Y:dimy] autorelease]; } 


- (Vector*)add:(Vector*)q { 
return [[[Vector vectorWithX:x+q.x Y:y+q.y] retain] autorelease]; } 

내가 그것을 시작 :

Vector *v1 = [[Vector alloc] initVector]; 
Vector *v2 = [[Vector alloc] initVector];  
Vector *vtotal = [[v1 add:v2] retain]; 

[v1 release]; 
[v2 release]; 
[vtotal release]; 

방법이 누출? 나는 그들을 풀어 놓거나 자동으로 풀어 준다. 이 앱을 유지하지 않으면 앱이 즉시 중단됩니다. 초기 출시 때문일 것입니다. 다른 릴리스를 추가하면 충돌이 발생합니다.

+0

당신 돈이 새 벡터를 추가/유지할 필요가 없으며 [벡터 vectorWithX : Y :]의 결과 만 반환하면됩니다. initVector와 같은 코드를 게시 할 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 이미 add/autorelease를 add에서 제거했지만 여전히 누출되었습니다. init 벡터는 다음과 같습니다. (x와 y는 합성됩니다) - (id) initVector {self = [super init]; if (self) {x = 0; y = 0; } return self; } – gok

답변

2

왜 메모리가 누출되고 있다고 생각하십니까? 그것부터 시작하십시오. 액세스 할 때 어떤 객체가 충돌합니까? 그러면 언더 앤 홀리 드 (under-retain)과 관련된 오브젝트가 무엇인지를 가장 잘 알 수 있습니다. 추측을해야만한다면 initVector는 메소드의 이름이 매우 이상하다는 이유로 의심 할 만합니다. 그것은 무엇을합니까? 왜 그것은 단지 "init"이라고 불리지 않는가?

이 스레드 코드입니까? 당신은 일반적으로 적절한 것보다 더 많은 유지/자동 해제를하고 있습니다. 현재 이벤트 루프를 통해 객체를 고정하기 위해 객체를 유지할 필요가 없습니다. 일반적으로 당신은 다음 이벤트 루프를 통해 필요한 것이기 때문에 ivars 만 유지합니다. 접근 자 외부에서 계속 호출하라는 요청이 많으면 메모리를 잘못 관리하는 경우가 거의 확실합니다. 위해야한다 : 개인적으로

+ (id)vectorWithX:(float)dimx y:(float)dimy 
{ 
    return [[[Vector alloc] initVectorWithX:dimx y:dimy] autorelease]; 
} 

- (Vector*)add:(Vector*)q 
{ 
    return [Vector vectorWithX:(self.x + q.x) y:(self.y + q.y)]; 
} 

... 

Vector *v1 = [[Vector alloc] initVector]; 
Vector *v2 = [[Vector alloc] initVector]; 
Vector *vtotal = [v1 add:v2]; 
... 
[v1 release]; 
[v2 release]; 

, 내가 처리 할 것 V1/V2 나는 그것이 코드가 더 유지 보수하고 이해하게 생각하지만, 생각의 다른 학교가 있기 때문에 오토 릴리즈와 :

Vector *v1 = [[[Vector alloc] initVector] autorelease]; 
Vector *v2 = [[[Vector alloc] initVector] autorelease]; 
Vector *vtotal = [v1 add:v2]; 
+1

안녕하세요, @rob, 당신은 당신의 정리 예제에서 벡터를 과도하게 풀어 봤습니다. –

+0

나는 둘 다 거꾸로 세웠다 .... 고마워. 결정된. –

+0

@gok, 위의 설명에서 코드를 살펴보면 해당 메소드는 "initVector"가 아닌 "init"이어야합니다. 그리고 직접 ivars에 액세스하는 것이 아니라 접근자를 사용하고 있는지 확인해야합니다. 접근자를 사용하지 않으면보고있는 것과 같은 메모리 오류가 # 1 원인입니다. 네, 이것들이 부유하다는 것을 압니다. 어쨌든 접근자를 사용하십시오. 실제 누수가 다른 곳에있을 가능성이 있습니다. 아마 벡터를 보유하고있는 다른 것에서. (하지만 왜 누수가 있다고 생각합니까?) –