2010-06-09 3 views
4

저는 ASIHTTPRequest 라이브러리를 사용하고 있으며 메모리 관리 관점에서 좋은 방법으로 사용하고 싶습니다. 내가 만들 :자동 회수 된 객체를 유지해야합니까?

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl]; 

내가 명명 규칙에 따라 내가 바로, 요청 객체를 보유 할 필요가 없습니다 것 같아요? 하지만 requestWithURL의 코드를 볼 때 someUrl 방법은 내가 볼 수 있습니다

+ (id)requestWithURL:(NSURL *)newURL 
{ 
return [[[self alloc] initWithURL:newURL] autorelease]; 
} 

이렇게 반환 된 객체는 오토 릴리즈된다. 내 코드에 그대로두면 안 될까요?

답변

3

일반적으로 autoreleased이므로 autorelease 풀에 보관되고 범위를 벗어날 때 풀어 놓습니다. 그러나 제공하는 추가 보안이 필요한 상황에 있으면 계속 유지 한 다음 해제 할 수 있습니다. 당신이 메서드 내에서 오토 릴리즈 객체를 사용하는 경우

+0

그러나, 나는 유지하지 않는 경우 그 객체는 자동 릴리즈 풀이 그것을 릴리즈 할 가능성이 있으며 나는 잘못된 객체로 끝날 것입니다, 그렇습니까? – Jakub

+0

그것은 아키텍처에 따라 다르지만 그렇게 생각하지는 않습니다. (어떤 실수도 없었습니다. 그런 식으로 넣어 둡니다.) 그런 다음 릴리스를 유지할 범위가 있다면 아무런 해를 입지 않을 것입니다! – Andiih

4

, 당신은 유지하지해야한다, 그래서 이것은 괜찮 : 당신이 바르에서 오토 릴리즈 객체를 저장하려면

- (void) myMethodDoRequest 
{ 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl]; 
    // use request within this scope only 
} 

, 당신의 라이프 사이클을 확장 유지해야 객체, 그리고 후자의 방출은 누출을 피하기 위해 :

@interface MyClass 
{ 
    ASIFormDataRequest *request; 
} 

- (void) myMethodStoreRequest 
{ 
    [request release]; 
    request = [[ASIFormDataRequest requestWithURL:someUrl] retain]; 
} 

- (void) dealloc 
{ 
    [request release]; 
} 
관련 문제