2011-09-13 3 views
1

저는 첫 번째 큰 응용 프로그램에 있는데 여기 메모리 관리에 약간의 문제가 있습니다.IOS 개발, if 및 else 및 autorelease를 사용하는 return 함수

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 
    if([date isKindOfClass:[NSString class]]) 
     return [dateFormatter dateFromString:date]; 
    else 
     return [dateFormatter stringFromDate:date]; 
} 

자, 내가 본 것처럼,이 예제의 모든 리턴은 결국 자동 릴리즈가 필요합니다. 하지만 autorelease를 추가 할 때 EXC_BAD_ACCESS 오류가 발생하고 모든 것이 잘 작동합니다. 내가 문제를 분석하고 너무 많은 autorelease 함수에있어,하지만 어떻게 그것을 NSDateFormatter없이 메모리를 해제 할 수 있습니다 볼 수 없습니다.

아무도 설명 할 수 있습니까?

답변

3

어떤 일에 대해 왜 오토 릴리즈를 사용하지

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 

    id retVal; 
    if([date isKindOfClass:[NSString class]]) 
     retVal = [dateFormatter dateFromString:date]; 
    else 
     retVal = [dateFormatter stringFromDate:date]; 
    [dateFormatter release]; 
    return retVal; 

} 
+0

물론 할 수 있습니다.하지만 시도한 방식과 다릅니다. 고맙습니다. 이것은 명백한 방법입니다. 그리고 이것이 이것이 할 수있는 방법이라면, 그것은 내가 할 일입니다 :-) – Erez

+1

잘못된 객체에'autorelease'를 추가하는 것처럼 보입니다. 귀하의 질문에, 나는 당신이하고있는 수집 :'[[dateFormatter dateFromString : date] autorelease];'당신은 그것을 입고 있었어야했다 :'[[NSDateFormatter alloc] init] autorelease];' –

2

?

-(id) dateFormatter:(id)date{ 
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterLongStyle]; 
    if([date isKindOfClass:[NSString class]]) 
     return [dateFormatter dateFromString:date]; 
    else 
     return [dateFormatter stringFromDate:date]; 
} 
2

당신은 다른 방법으로이 작업을 수행 할 수 있습니다 :

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 

그 그것은 다시 온다 또한 올바르게 반환 변수를 할당하지 않는 것이 가능합니다.

2

네, 몇 가지 문제가 있습니다. 첫째, dateFormatter를 사용하고 있지만 반환하지는 않습니다. 따라서 dateFormatter를 초기화 할 때 autorelease를 호출해야하거나 NSDateFormatter에 자동 렌더링 된 객체를 지정해야합니다.

예 :

NSDateFormatter dateFormatter * = [NSDateFormatter의 ALLOC] INIT] 오토 릴리즈];

또는

NSDateFormatter dateFormatter * = [NSDateFormatter dateFormatter];

두 번째 방법은 존재하지 않지만 이러한 것들이 정상적으로 작동하는 방법을 알고있는 것이 좋습니다. 어쨌든 위의 첫 번째 방법을 사용하면 코드가 수정됩니다.

[dateFormatter stringFromDate : date] 또는 [dateFormatter dateFromString : date]를 호출하면 dateFormatter가 각각 NSString 또는 NSDate를 제공합니다. 두 경우 모두 해당 메서드 인 stringFromDate : date 또는 dateFromString : date가 자동으로 반환되는 NSString 또는 NSDate 객체를 만듭니다.

두 객체 중 하나가 이미 자동 릴리즈 되었기 때문에 객체를 그대로 반환 할 수 있습니다.