2008-11-01 10 views
1

NSDate 객체가 너무 빨리 할당 해제되는 문제가 있습니다. 이 문제는 NSDate의 편리한 메소드에서 반환 된 객체를 처리하는 방식과 관련이있을 것으로 생각됩니다. I 은 JKShow 클래스의 showDate 속성 선언이 "보유"되어야하지만 할당 또는 복사하도록 변경하면 문제에 아무런 영향을 미치지 않는 것으로 보입니다.코코아 편의 메소드에서 반환 된 객체 처리

JKShow *show; 
NSDate *date; 
NSMutableArray *list = [[NSMutableArray alloc] init]; 

// Show 1 
show = [[JKShow alloc] init]; 
//... 
date = [gregorian dateFromComponents:dateComponents]; 
show.showDate = date; 
[list addObject:[show autorelease]]; 

// Show 2 
show = [[JKShow alloc] init]; 
//... 
date = [gregorian dateFromComponents:dateComponents]; 
show.showDate = date; 
[list addObject:[show autorelease]]; 

UPDATE

문제는 여기에 복사 한 코드가 아니었다. 내 JKShow init 메서드에서 나는 NSDate 편의 메서드에서 반환 된 날짜를 유지하지 못했습니다. 도와 줘서 고마워. 모두들.

답변

0

모든 도움을 주셔서 감사합니다. 문제는 여기에 게시 된 코드의 범위를 벗어났습니다. 나는 내 init 메소드에서 만든 NSDate을 유지하지 못했습니다. 불행히도 충돌은 두 개의 새로운 NSDate 개체를 만들 때까지 발생하지 않았으므로 잘못된 트리를 완전히 짖고있었습니다.

+0

원래 질문에 대한 수정 사항으로 업데이트를 게시하는 것이 좋습니다. 당신이 그것을 발견했기 때문에 다행입니다. 이런 것들을 사냥하는 것은 항상 고통입니다. – philsquared

2

dateFromComponents에서 반환 된 날짜는 자동 회수 풀에 있어야하므로 showDate 속성을 "보유"해야합니다. 사실 그것은 어쨌든해야합니다 (특별히 "복사"를 원하지 않는 한).

표시 한 코드에서 쇼 개체의 소유권을 목록에 완전히 부여하는 것처럼 보입니다 (추가 할 때 autorelease를 설정하는 것처럼). 쇼 객체가 목록에서 나오기 전에 (또는리스트가 할당 해제되기 전에) 데이트 객체가 할당 해제된다는 말입니까?

또한 합성 속성을 사용하고 있습니까? 아니면 직접 작성하고 있습니까? 후자의 경우 setShowDate 속성 메서드는 무엇입니까?

날짜 개체의 retainCount를 다른 위치에 로깅 해 볼 수도 있습니다 (필자는 항상 autorelease가 실제로 복잡하다는 것을 알지만).

2

showDate가 보유해야하는 코드가 충분한 보유 속성 인 경우. 다른 것 (아마도 JKShow의 구현에서)이 올바르지 않을 수 있습니다.

무슨 일이 일어나고 있는지 알아 보려면 Instruments를 사용하여 개체 수명을 확인하십시오. 보유 및 릴리스 기억하도록 할당 도구를 사용하여 실행해야합니다. 기본적으로 누수 성능 도구를 실행하면이 방법으로 설정됩니다.

인스트루먼트를 실행하면 모든 오브젝트의 수명과 그에 대해 발행 된 모든 보유 및 릴리스에 대한 백 트레이스가 기록됩니다. 객체를 살펴보면 날짜 중 하나를 찾고 가짜 릴리즈가 발생한 위치를 파악할 수 있어야하는 모든 유지 및 릴리스를 살펴보십시오.

+0

지금이 문제를 조사하고 있습니다.하지만 여기에있는 동안 프로젝트에서 계측기의 연결을 어떻게 해제합니까? 과거에는 xcode를 다시 시작했지만 더 좋은 방법이 될 것 같습니다. – kubi

+0

"Go (이동)"를 선택하면 마지막으로 수행 한 작업 (실행, 디버그, 누수 등)이 수행됩니다. 명시 적으로 Run을 선택하면 다음에 Go 버튼을 누를 때 Instrument없이 app이 실행됩니다. –

0

표시된 코드에 조기 출시 문제가 없습니다. 배열을 해제하지 않기 때문에 사실 배열과 그 안의 모든 것이 누설됩니다.

가비지 수집기가 켜져 있습니까?

list은 인스턴스 변수 또는 정적 변수입니까, 아니면 로컬 변수입니까?

+0

목록 개체는 나중에 사용되며 문제가 없습니다. 가비지 콜렉션 없음. List는 지역 변수입니다. – kubi

관련 문제