2010-04-26 7 views
1

그래프 응용 프로그램을 개발 중이며 렌더러를 OpenGL에서 Quartz2D로 변경하여 텍스트 렌더링을 더 쉽게 만들려고합니다.NSDate 메모리 문제 (다시)

NSMutableString이 자신의 설명을 추가하려고 시도 할 때 충돌을 일으키기 전에 갑작스럽게 자체적으로 할당이 해제 된 것처럼 보이는 유지 된 NSDate 객체입니다 (현재 'nil').

빌드 & analyze는 잠재적 인 문제를보고하지 않습니다.

간체, 코드는 다음과 같습니다

NSDate* aDate 

-(id)init 
{ 
    aDate = [[NSDate date] retain] 
    return self; 
} 

-(void)drawRect(CGRect)rect 
{ 
    NSMutableString* stringy = [[NSMutableString alloc] init]; 

    //aDate is now deallocated and pointing at 0x0? 
    [stringy appendString:[aDate description]]; //Crash 
} 

내가 실제 코드는 별도의 스레드는 날짜 객체를 액세스와 함께, 더 많은 복잡한보다 것을 강조해야한다, 그러나 적절한 잠금 위치에 있습니다 [aDate release] 코드를 단계별로 실행할 때 어디에서도 호출되지 않습니다.

[[NSDate alloc] init]을 사용하면 동일한 효과가 있습니다. init을 호출 할 첫 번째 함수라고 추가해야합니다.

내가 간과 한 것 또는 NSDate 개체가 자체를 릴리스하는 이유는 누구나 제안 할 수 있습니까?

+0

큰 노트를 작성해야합니다. init 메소드에서 할당/초기화 된 것은 drawrect 메소드의 범위에 포함되지 않습니다. 클래스 외부에서 호출되고 실행되는 것처럼 말입니다. 문제는 NSDate 자체와 관련이없는 것 같습니다. – Tobster

답변

0

테스트하지 않았습니다.

[stringy appendString:[aDate description]]; 

[stringy appendString:[[NSDate date] description]]; 

에 그있는 NSDate 물건을 유지 모든 건너 :하지만 변경하여 훨씬 간단하지 않습니다?

+0

제안 해 주셔서 감사합니다.하지만 NSDate 개체 중 하나는 참조 용으로 사용되는 지속적인 응용 프로그램 실행 시간입니다. 다른 두 개는 그래프의 왼쪽과 오른쪽에 설정됩니다 (할당 취소되고 새로운 인스턴스를 유지하지만 코드는 아직까지 도달하지 않습니다). 그래서 나는 그 방법을 사용할 수 없다. – Tobster

1

aDate을 글로벌 인스턴스가 아닌 개체 필드로 사용해보십시오. 기본 init 메소드도 사용하십시오.

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) 
     aDate = [[NSDate date] retain] 
    } 
    return self; 
} 
0

drawRect : 메소드가 있다는 것은 NSView 또는 UIView를 서브 클래 싱한다는 의미입니다. 어느 경우에도 init 메시지가 보내지지 않습니다. 항상 initWithFrame : 또는 initWithCoder :로 초기화됩니다 (initWithCoder :는 nib 파일에서 뷰를 인스턴스화하는 데 사용됩니다). 당신은 그 두가지 방법 모두를 오버라이드 할 필요가 있습니다. - 하나의 전역 인스턴스를 가지고 있기 때문에 + 초기화를 구현해야합니다.

+(void) initialize 
{ 
    if (aDate == nil) 
    { 
     aDate = [[NSDate date] retain]; 
    } 
}