2012-02-20 4 views
0

누군가에게 빛을 발할 수있는 이상한 상황이 있습니다. 사용자 지정 개체에 NSCoding 프로토콜을 구현 중이며 initWithCoder:의 메모리 누수가 발생합니다. 나는 이런 식으로 뭔가가 :이 객체의 다른 속성을 많이 가지고decodeObjectForKey를 사용하는 동안 retainCounts를 이해합니다.

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"]; 
if(titleTemp) { 
    [self setTitleString:titleTemp]; 
} else { 
    [self setTitleString:[NSString string]]; 
} 

을, 일부는 배열, 일부 문자열 및 일부 프리미티브 (복식의 int는)이고, I는 지속적으로이 방법으로 메모리 누수를 얻고있다. Instruments는 누출이 decodeObjectForKey: 행의 각 디코딩에서 발생한다고 알려줍니다. 10 개 이상의 객체로 이루어진 배열에서 각 사용자 정의 클래스 내에있는 모든 디코딩 된 객체 하나가 누설되면 메모리가 더해 집니 다.

그러나 정말 난처한 상황에 빠진 것은이 코드의 출력이이었다 :

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"]; 
NSLog(@"%i", titleTemp.retainCount); 

은 "3"입니다!

와아, 모든 보유자는 어디에서 왔습니까? 나를 때려. 그러나 나는이 모든 누출을 알고 싶다. 감사!

답변

2

와아, 모든 보유자는 어디에서 왔습니까?

코드를 볼 수 없다면 말하기 어렵지만 코드가 아니라면 걱정할 필요가 없습니다. -decodeObjectForKey:이 실제로 문자열을 생성하는 다른 여러 메소드를 호출 할 수 있으며 그 중 하나가 문자열을 보유하고 이후에 자동으로 해제 할 수 있습니다.

저를 이깁니다. 그러나 나는이 모든 누출을 알고 싶다.

누출을 찾기 위해 -retainCount을 사용하는 대신 유출 된 물체를 확인하십시오. 인스트루먼트를 사용하면 도움이됩니다. 보존 (물론 alloc, copy, new new)과 그 오브젝트에 대한 릴리즈의 균형을 맞추고 있는지 확인하십시오. 물체를 너무 많이 잡고 있거나 너무 미약하다면 누수가 발생할 것입니다. 컨트롤 외부의 일부 코드가이를 수행하고 있다면 어쨌든 그것에 대해 할 수있는 일이별로 없습니다.

+0

비슷한 질문에 대한 답을 다시 읽는 동안, 나는 'dealloc'에 내 모든 '보유'속성을 공개하지 않는다는 것을 깨달았습니다 (duh!). 그래서 당신은 옳았습니다. 저는 단순히 저의 보유/발표의 균형을 맞추지 않고있었습니다. 자야겠다. 시간 내 줘서 고마워. –

2

읽어보기 : http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/. 그는 정확합니다. 이것이 의미하는 바는 retainCount에 의해 반환 된 값을 무시하면서 코코아의 메모리 관리 규칙을 따라야한다는 것입니다. 보존했거나 init, new, copy 또는 mutableCopy으로 시작하는 방법으로 얻은 것이므로 release 또는 autorelease이 소유하고 있는지 확인하십시오. 또한 귀하의 릴리스/autoreleases 소유 참조와 균형을해야합니다. 따라서 한 번 객체를 유지하면 한 번만 해제 할 수 있습니다.

이 경우 사용자가 게시 한 작은 스 니펫에는 문제가없는 것 같습니다. 중요한 점은 retainCount를 사용하여 디버깅하지 말아야한다는 것입니다.

+0

왜 개체가 보유 회수가 높은 반환 개수로 반환 될지 궁금했습니다. –

+0

이유를 정확히 말하기는 어렵지만, 시스템 프레임 워크가 개체를 확보하기 전에 여러 번 유지하기 때문에 가능합니다. –

관련 문제