2012-03-24 3 views
1

나는 이것이 상당히 기본적인 것들이라는 것을 알고있다.반환 할 값을 어떻게 해제합니까?

달의 이름을 반환하는 함수가있는 클래스가 있습니다. 누출을 방지하기 위해 돌아가고 싶은 가치를 공개하는 방법을 모르겠습니다.

static NSDateFormatter *formatter = nil; 
if (formatter == nil) { 
    formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateFormat:@"MMMM yyyy"]; 
} 

상황이 발생하고 : 클래스에서

이 값은 선언

if([exampleDate isEqualToDate: 
    [[self creationDate] laterDate:exampleDate]]) 
{ //earlierDate returns the earlier date 
    return(@"Examples"); 
}else{ 
    return([formatter stringFromDate:[self creationDate]]); 
} 

나는 오토 릴리즈를 사용하여 시도했지만 나는 충돌을 얻을 수 있기 때문에 내가 잘못을 사용하고 있습니다 내가 그것을 풀려고 할 때. 또한 문자열에 반환 값을 할당하려고 시도했지만 동일한 충돌 문제가 있습니다. 미안하지만, 근본적인 질문을하는 것에 대해 유감스럽게 생각합니다. 그러나 가치를 되돌려보고 작동 방식을 이해하면서 적절하게 공개하는 방법을 알고 있으면 감사하겠습니다.

+0

. 충돌시 autorelease를 어떻게 사용하고 있습니까? –

+0

ARC로 전환하지 않는 특별한 이유가 있습니까? 이 질문은 부적절한 것입니다 : – dasblinkenlight

+0

예를 들어 formatter 승인 [= [[NSDateFormatter alloc] init] autorelease]; – glenstorey

답변

0

반환 부분에는 누출이 없습니다. stringFromDate:copy이 아니기 때문에 mutableCopy, retain, alloc 또는 new이므로 이미 자동 렌더링 된 개체를 반환합니다.

NSDateFormatter은 수업이 할당 해제 될 때 유출됩니다. 유출을 원하지 않으면 @property을 생성하고 dealloc에서 해제해야합니다.
로컬 정적 개체는 항상 유출됩니다.
나는 싱글 톤 외부에서 그런 객체를 사용하지 않을 것이다. 클래스를 만들 때마다 NSDateFormatter가 누출됩니다. @property을 사용하면 거의 모든 경우에서 더 좋습니다.

이 같은 해킹을 본 적이 있지만, 내 생각에 그들은 당신이 처음부터하지 말았어야 문제를 해결 :

그것은 오토 릴리즈가 어떻게 구성되어 있는지 확실히이다
- (NSString *)someDateFromString:(NSString *)str { 
    static NSDateFormatter *formatter = nil; 
    if (formatter == nil) { 
     formatter = [[NSDateFormatter alloc] init]; 
    } 
    if (str == nil) { 
     [formatter release]; 
     formatter = nil; 
     return nil; 
    } 
    // do something 
    return date; 
} 

- (void)dealloc { 
    [self someDateFromString:nil]; // will release the static date formatter. 
    [super dealloc]; 
} 
+0

하지만 언제 포맷터가 사라지거나 해제됩니까? 나의 (이해할 수 있듯이 결점이있는) 이해는 당신이 당신을 풀어줄 필요가 있다면 당신이 할당해야한다는 것입니다. – glenstorey

+0

해제하려는 경우 정적 변수를 만들지 마십시오. 그것을위한 @property를 생성하고 dealloc에서 그것을 해제하십시오. –

+0

알겠습니다. 클래스에는 아직 dealloc 함수가 필요하지 않기 때문에 dealloc 함수가 없습니다. @property와 dealloc tmrw를 추가하고 어떻게 시작하는지 알려 드리겠습니다. – glenstorey

관련 문제