2011-01-17 2 views
1

메모리 누수 및 기존 iPhone 응용 프로그램의 다른 문제를 정리하려고합니다. 나는 Objective C에 조금 새로운 것이지만, 좋은 프로그래밍 기초와 iphone 앱을 개발할 때 필요한 메모리 관리에 대한 일반적인 이해를 가지고있다. 내 질문은 아래의 방법에 대한 것입니다.iPhone 오류 '참조 카운트 된 개체는 출시 된 후에 사용 오류입니다.'; 메모리 누수 정리

-(NSDate *)formatDate:(id)value{ 
NSLog(@"eja: DetailViewController/ formatDate()"); 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
[dateFormatter release]; 


return [dateFormatter dateFromString:value]; 


} 

그것은 읽는 오류를 반환 "이를 출시 한 후 참조 된-계산 개체가 사용하는 것입니다." 반환 된/사용되기 전에 dateFormatter 해제 된 것을 볼 수 있습니다. 문제는 return 문 다음에 릴리스를 놓는 경우 dateFormatter var 선언과 관련된 '잠재적 인 객체 누수'오류가 발생한다는 것입니다.

은 또한 "오토 릴리즈"

return [[dateFormatter dateFromString:value] autorelease]; 

을 시도하지만 다음 오류 '전송 객체 - 오토 릴리즈 너무 많이'를 얻을.

올바르게 작성하여 변수를 적절하게 관리하는 방법에 대한 조언이 있으십니까? 당신이 NSDateFormatter을 해제하기 전에

답변

2

는 교체

[dateFormatter autorelease]; 

하고 작동해야와

[dateFormatter release]; 

!

+0

그래, 실제로 그렇습니다! 아주 간단합니다. 정말 고맙습니다. – djeddiej

2

당신은 NSDate를 만들 수 있습니다

-(NSDate *)formatDate:(id)value 
{ 
    NSLog(@"eja: DetailViewController/ formatDate()"); 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
    NSDate *date = [dateFormatter dateFromString:value]; 
    [dateFormatter release]; 

    return date; 
} 

이 방법을, 당신의 NSDateFormatter을 할당 예상대로 출시됩니다 동안 수동 메모리 관리를 필요로하지 않는다 반환하는 객체입니다.

+0

이 솔루션이 작동합니다. 감사합니다! 그러나 내가 더 질문 할 수 있다면, date라는 변수는 어떻게 될까요? 나도 그걸 정리해야하지 않니? 그냥 궁금해 ... 다시 감사합니다 – djeddiej

+0

또한, 두 사람 모두에게 체크 표시를하고 싶지만, 필자는 아래의 phix23 솔루션을 사용했습니다 (그러나 참조 용으로 유지했습니다). 다시 한 번 감사드립니다 – djeddiej

+0

날짜 변수는이 방법에서 사용하는 동안 메모리에 유지됩니다. @ phix23의 해결책을 사용하는 단점은'dateFormatter'가 절대로 릴리즈 될 수 없다는 것입니다. http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/autorelease –

0

[dateFormatter release]을 쓰는 대신 자동으로 코드를 저장하고 코드 줄을 저장할 수도 있습니다.

- (NSDate *)formatDate:(NSString *)value { 
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.S"]; 
    return [dateFormatter dateFromString:value]; 
}