2011-12-13 7 views
0

도움이 필요합니다. 일부 ASIHTTP 요청을 만들고 있지만 때로는 충돌이 발생합니다.ASIHTTPRequest 초기화

내가 초기화했기 때문에 발견했습니다. 나는이 같은 코드를 사용합니다

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:myURL]; 
{my code} 
[request release]; 

나이 :

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:myURL]; 

당신은 차이를 말할 수 있습니까?

추신 : 한 번에 시작하는 요청과 이전에 시작하는 요청이 각각 10 개씩 있습니다.

+0

더 나은 답변을 위해 전체 코드를 게시하십시오. –

답변

3

첫 번째 것은 표준 할당이고 두 번째는 autoreleased 개체를 반환하는 클래스 메서드를 의미합니다.

컨트롤러 (또는 viewController) 안에이 코드가 있다고 가정하면 메서드가 끝나면 request 개체가 할당 해제됩니다. 컨트롤러 내부에서 해당 객체에 대한 참조를 유지해야 할당이 해제되지 않습니다.

그래서, 당신의 인터페이스 정의 : 둘 이상의 요청이있는 경우

@interface MyController : UIViewController { 
    ASIHTTPRequest *request; 
    // ... 
} 

@property (nonatomic, retain) ASIHTTPRequest *request; 

@end 

그리고 그런데 다음 구현

@implementation MyController 

@sinthetyze request; 

- (void) aMethodThatInstantiatesYourRequest { // using self.request means that we use the accessory method, which involves a retain call 
    self.request = [[ASIHTTPRequest alloc] initWithURL:myURL]; 
    // ... 
    [request release]; 

    // or using the autoreleased object 
    self.request = [ASIHTTPRequest requestWithURL:myURL]; 
} 

- (void) dealloc { // don't forget to release the request object 
    [request release]; 
    [super release]; 
} 

,을 사용하는 것이 좋을 것이다 네트워크 큐이므로 다양한 단일 요청 대신 큐에 대한 참조를 유지해야합니다.

See this gistASINetworkQueue을 사용합니다.

+0

대단히 고마워요. 나는 충돌이 없으며 이전보다 빠르게 작동합니다. – werbary

0

소스 코드를 확인한 후에 차이점을 확인할 수 있습니다.

첫 번째 부분 : 수동으로 해제 요청 개체가 필요하지만 두 번째 형식보다 안정적입니다.

두 번째 부분 : 요청 사용 자동 릴리스 방법을 만듭니다. 이것은 대부분의 시간에 올바르게 작동합니다.

앱이 과도한 요청 할당 및 해제를 처리해야하는 경우 먼저 asi 요청을 만드는 첫 번째 방법을 사용하는 것이 좋습니다.