2009-12-18 2 views
1

이 줄을 포기의 setObject : [mymutabledict setObject:myclassobj forKey:myclassobj.myidstring];NSMutableDictionary 오류를 "메시지가 할당이 해제 된 인스턴스로 전송"코드의

이 오류주고 있습니다 :

*** -[NSCFString hash]: message sent to deallocated instance 0x3c14610

나는 그 줄에 중단 점에 넣어 내가 확인했습니다 3 개의 모든 객체 (mymutabledict, myclassobj 및 myclassobj.myidstring)가 제대로 할당되고 디버거에 올바르게 표시됩니다. 이 오류의 원인은 무엇입니까? 이전 항목을 사전에 넣는 데 사용한 객체 또는 키와 관련이있을 수 있습니까?

사용 된 키가 이전에 입력 한 키 중 하나와 일치하지 않는지 확인했습니다.

약간의 추가 정보 : SQL 데이터베이스의 개체를 메모리의 변경 가능한 사전에로드하고 있습니다. 이 코드는 몇 주 동안 몇 가지 샘플 데이터 세트에서 모두 잘 작동했으며 오늘은 DB의 특정 복사본이 하나있었습니다. 감사!

+0

주소 0x3c14610은 세 개체 중 하나에 해당합니까? – TechZen

+0

아니요. 죄송합니다. 제가 확인했음을 언급하는 것을 잊어 버렸습니다. 그리고 그 3 가지 객체 중 하나에도 해당하지 않았습니다. – mjdth

+0

다른 DB에 대해 사실이 아닌 DB 사본에 대해 고유 한 점은 무엇입니까? 더 큰가요? 중복 된 내용이 포함되어 있습니까? – benzado

답변

3

무언가에 release 번을 너무 많이 호출하는 것처럼 보입니다. 해당 코드 바로 위에 다음 코드를 추가하십시오.

for (NSString *key in mymutabledict) { 
    NSLog(@"Key %@ maps to %@.", key, [mymutabledict objectForKey:key]); 
} 
NSLog(@"About to add %@", myclassobj); 
NSLog(@" with key %@", myclassobj.myname); 

... 충돌 개체를 찾으십시오.

개체가 NSDictionary/NSMutableDicitonary 개체에 추가 될 때 키가 그대로 유지됩니다. 사전에서 키를 가져와 해제하는 경우 (예 : 위의 코드 또는 [mymutabledict allKeys]을 통해 가져온 문자열 개체에 [key release]을 호출하는 경우) 그렇게 할 수 있습니다.

+0

나는 이것이 대답으로 이끌어 가고 있다고 생각한다. 귀하의 코드를 사용하여 중복 ID가있는 항목을 사전에 추가하려고 할 때 문제가 발생하는 것으로 나타났습니다. 이제 사전에 새로운 객체를 저장하기 전에 사전에 해당 키에 무언가가 있는지 확인해야합니다. – mjdth

+0

이것은 그랬습니다. 내가 한 일은 가변 배열을 만들고 키에 사용 된 모든 값을 저장하여 동일한 키에 여러 객체를 할당하지 않도록하는 것이 었습니다. 문제가 해결 된 것 같지만 그 이유는 모르겠습니다. – mjdth

1

NSZombieEnabled으로 프로그램을 실행하십시오. NSZombieEnabled는 보유 개수가 0이되면 NSMombie 객체에 대한 객체의 유형을 NSZombie 객체로 변경합니다. 메시지가이 좀비 객체로 전송 될 때마다 프로그램이 즉시 중단되어 문제가 발생한 위치를 정확히 볼 수 있습니다. .

+0

링크를 따라 지나치기를 반복 할 때 호출되는 메소드를 찾는 방법을 배우십시오. 이것은 당신의 목표를 달성하는 데 도움이 될 것입니다. –

1

"myidstring"속성을 어떻게 정의합니까? 그것이 NSString이기 때문에 참조를 유효하게 유지하기 위해 그것을 "@property (retain)"로 선언했습니다.

관련 문제