2011-10-07 3 views
1

그것은 아마도 간단한 문제 일 것입니다. 그러나 저는 잠시 동안 이것을보고 있었고 그것을 찾을 수 없습니다!ASIHTTPRequest가 충돌합니까?

나는 다음과 같은 SOAPRequest 클래스가 :

@interface SoapRequest : NSObject 

@property (retain, nonatomic) NSURL *endPoint; 
@property (retain, nonatomic) NSString *soapAction; 
@property (retain, nonatomic) NSString *userName; 
@property (retain, nonatomic) NSString *passWord; 
@property (retain, nonatomic) NSString *postData; 
@property (retain, nonatomic) NSObject *handler; 
@property SEL action; 

+ (SoapRequest*) create: (NSObject*) target endPoint: (NSString*) endPoint action: (SEL) action soapAction: (NSString*) soapAction postData: (NSString*) postData; 

- (id)sendSynchronous; 
- (void) send; 

@end 

구현 다음과 같이 :

@synthesize endPoint = _endPoint, soapAction = _soapAction, userName = _userName, passWord = _passWord, postData = _postData, action = _action, handler = _handler; 

+ (SoapRequest*) create: (NSObject*) target endPoint: (NSString*) endPoint action: (SEL) action soapAction: (NSString*) soapAction postData: (NSString*) postData 
{ 
    SoapRequest *request = [[SoapRequest alloc] init]; 
    request.endPoint = [NSURL URLWithString:endPoint]; 
    request.soapAction = soapAction; 
    request.handler = target; 
    request.action = action; 
    request.postData = postData; 

    return [request autorelease]; 
} 

그리고 내 보내기 기능 :

- (void) send 
{ 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:self.endPoint]; 
    [request setDelegate:self]; 

    [request addRequestHeader:@"Content-Length" value: [NSString stringWithFormat:@"%d",[self.postData length]]]; 
    [request addRequestHeader:@"Content-Type" value:@"text/xml"]; 

    if(self.soapAction) 
    { 
     [request addRequestHeader:@"soapAction" value:self.soapAction]; 
    } 

    [request appendPostData:[self.postData dataUsingEncoding:NSUTF8StringEncoding]]; 
    [request startAsynchronous]; 
} 

나는에 기본 ASIHTTPRequest 방법이 있나요 오류를 듣거나 끝내면 다음과 같이 마무리됩니다.

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    [self.handler performSelector:self.action]; 
} 

이 클래스를 ASIHTTPRequest, [request setDelegate : self]에 대한 대리자로 만들려는 경우 충돌이 발생합니다. 나는 그것이 첫 번째 기능에서 Autoreleasing과 관련이 있다고 생각했다. 그러나 나는 그것을 고치는 방법을 모른다.

편집 :

이 내 SoapRequest 초기화하기 방법은 다음과 같습니다

- (SoapRequest*) DefinedEntities: (id) _target action: (SEL) _action 
{ 

// some data inits 

    SoapRequest *request = [SoapRequest create: _target endPoint:endPoint action:_action soapAction:soapAction postData:xmlString]; 
    [request send]; 

    return request; 
} 

을 그리고 이것은 내가 다음과 같은 초기화하기 : 인스턴스를 만드는 곳

Metadata *service = [[Metadata alloc] init]; 
[service DefinedEntities:self action:@selector(MetadataFinished:)]; 
+0

:

나는에-사이의 클래스해야했다. – JosephH

+0

'[autorelease 요청]을'return request '로 바꾸면 어떻게됩니까? – dragonfly

+0

그러면 작동합니다. 이미 알고 있습니다. – Wesley

답변

0

보존은 실제로 좋은 옵션이었습니다. 저는 코드에서 오타가 발견되어서 제가 잘못했는지 알아 냈습니다. 활성화 NSZombies와 디버거에서 응용 프로그램을 실행하고 youe 잘못된 객체에 대한 첫 번째 호출에 대한 스택 추적을 질문에 추가하십시오

- (SoapRequest*) DefinedEntities: (id) _target action: (SEL) _action 
{ 

// some data inits 

    SoapRequest *request = [SoapRequest create: _target endPoint:endPoint action:_action soapAction:soapAction postData:xmlString]; 
    [request send]; 

    return request; 
} 
1

코드를 게시하시기 바랍니다 다음을 사용하는 SOAPRequest 객체의 이름 :

+ (SoapRequest*) create: (NSObject*) target endPoint: (NSString*) endPoint action: (SEL) action soapAction: (NSString*) soapAction postData: (NSString*) postData; 

보관해야 할 수도 있습니다. 제쳐두고, 목표는 NSObject의 인스턴스가 될 것이므로 (서브 클래스가 될 것입니다) NSObject * 대신 'id'를 대상 매개 변수로 사용해야합니다.

+0

첫 번째 게시물을 수정했습니다. – Wesley

+0

실제로이 인스턴스가 반환됩니까? self.endPoint가 존재합니까? ASIHTTPRequest * request = [ASIHTTPRequest requestWithURL : self.endPoint]; – Alex

+0

이것으로 모든 것을 볼 수 있고 끝 점이 있지만 프라이버시 목적으로 링크를 삭제했습니다 – Wesley

1

대리인으로 self (SOAPRequest)를 설정할 때만 크래시가 발생하면 자체가 할당 취소되지 않았는지 확인하십시오. 그러면 ASIHTTPRequest가 더 이상 존재하지 않는 대리인에 대한 작업을 완료했을 때 잘못된 액세스가 발생합니다.).

- (SoapRequest*) DefinedEntities: (id) _target action: (SEL) _action 
{ 

// some data inits 

    SoapRequest *request = [SoapRequest create: _target endPoint:endPoint action:_action soapAction:soapAction postData:xmlString]; 
    [request send]; 

    return request; 
} 

이 작업을 수행 할 때, 요청이 오토 릴리즈하고 당신이 그것을 완료 또는 실패 보낸 ASIHTTPRequest 때까지 사람에 의해 유지되고 있는지 확인해야합니다.

+0

어디에서 보관해야합니까? – Wesley

+0

누구든 - (SoapRequest *) DefinedEntities : (id) _target 액션 : (SEL) _action 메소드를 호출하는 사람. – jbat100

+0

비누 요청 클래스와 같은 자체 해제 클래스를 가질 수 없습니까? httprequest 비동기를 수행하고 필요할 때 클래스가 자동으로 해제되도록 할 수 있습니까? 나를 잘못하지 마라, 나는 객관적인 초보자 다! – Wesley

5

같은 문제가있었습니다. 문제는 대리자 메서드가 호출되기 전에 할당이 해제된다는 것입니다. 시작 방법에 retain을 넣고 완료 ​​방법에 release을 넣기 만하면됩니다. 오류 메서드에서 해제하는 것을 잊지 마십시오. 그러면 요청이 수행되는 동안 오브젝트의 수명이 연장됩니다.

+1

ARC에서는 불가능합니다. –

+0

그게 사실이야. 하지만 요즘에는'ASIHTTP'를 사용해서는 안됩니다;) –

관련 문제